<分区>
我有一个函数:
<T> T get(Class<T> fetchType) {
...
}
所以,如果我要做这样的事情:
String x = get(String.class);
这一切都很好。
然而,在另一个函数中:
<R> R otherFunction(R base) {
return get(base.getClass());
}
给我一个错误,因为 base.getClass()
返回 ? extends R
.
reason: no instance(s) of type variable(s) exist so that capture of ? extends Object conforms to R
inference variable T has incompatible bounds:
equality constraints: capture of ? extends Object upper bounds: Object, R
现在据我了解,函数 get(Class<T> x)
返回 T
, 所以当用 ? extends R
调用时,假设是 CAP#1
, 但自 get
现在返回 CAP#1
, 将其分配给类型 R
应该不是问题。为了对此进行测试,我尝试了:
Class<? extends CharSequence> stringClass = String.class;
CharSequence x = get(stringClass);
这似乎没有任何问题。出了什么问题?
编辑:这是因为类型删除,在运行时没有关于 R
的信息吗?可用,但 CharSequence
是?这仍然没有意义,因为这不是仅在编译阶段进行的纯粹检查吗?
所以,结果是 Object.getClass()
返回 Class<? extends |X|>
而不是 Class<? extends X>
, 其中|X|
是删除 X
这就是为什么它适用于具体类型(如 ? extends CharSequence
,但不适用于通用类型)。 IntelliJ 可能没有准确报告,这导致了困惑: (我尝试截屏,但弹出窗口一直在消失)。