内部泛型 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);
}
我挣扎于以下内部 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);
}