内部泛型 class 的调用方法无法识别泛型类型

Called method of inner generic class doesn't recognize the generic type

我挣扎于以下内部 class "inheriting" 外部 class 的通用参数 T。以下几行是错误的:

String string = "string";
new OuterClass<>()
    .inner(string)
    .call(s -> s.length());       // Cannot resolve method 'length' in 'Object'

这些 class 的最小且可重现的示例:

public class OuterClass<T> {

    public InnerClass<T> inner(T object) {
        return new InnerClass<>(object);
    }

    @AllArgsConstructor(access = AccessLevel.PRIVATE)
    public static final class InnerClass<U> {

        U object;

        public final void call(Consumer<U> consumer) {
            consumer.accept(object);
        }
    }
}

为什么会这样?我应该如何通过创建内部 class?

来指定通用参数

本质上,这是因为 <> 中的类型推断没有考虑到您链接的后续方法。

例如,这会创建一个 ArrayList<Object>:

new ArrayList<>().add("");

如果我在 <> 中插入单词 String,IntelliJ 不会抱怨单词 String 是多余的。

同样,这会产生一个错误:

OuterClass<String>.InnerClass i = new OuterClass<>().inner(string);

因为右边是OuterClass<Object>.Inner,而左边是OuterClass<String>.InnerClass

要解决此问题,您需要指定通用参数:

new OuterClass<String>()
    .inner(string)
    .call(s -> s.length()); 

关于您的编辑,编辑后的inner方法仍然依赖于Outer的泛型类型,无法正确推断。

您可以通过添加另一个泛型参数使 Inner 创建的对象 依赖于 Outer 的泛型类型:

public <U> InnerClass<U> inner(U object) {
    return new InnerClass<>(object);
}