编辑:更简单的例子:
public <T> void shouldBeAbleToGetClassOfT(T t) {
Class<T> tClass;
// OK, but shows "unchecked cast" warrning.
tClass = (Class<T>) t.getClass();
// Compilation error!
tClass = t.getClass();
}
类型不兼容。
需要:Class<T>
找到:Class<capture<? extends java.lang.Object>>
我对下面示例中的类型擦除有些困惑:
public static class Example<T> {
private final T t;
public Example(final T t) {
this.t = t;
}
public <U extends T> void test(Consumer<T> consumer, U u) {
// OK, but shows "unchecked cast" warrning.
consumer.accept((T) t.getClass().cast(u));
// OK, but shows "unchecked cast" warrning.
consumer.accept(((Class<T>)t.getClass()).cast(u));
// Compilation error!
consumer.accept(t.getClass().cast(u));
}
}
这里的错误是:
Error:(21, 46) java: 不兼容类型: 无法将java.lang.Object转换为T
这里到底发生了什么?
.getClass()
的返回值被擦除了吗?为什么?
如何最好地处理这个错误?
编辑: 这里是一个更复杂的用例,更接近于我的问题:
public class A<T> {
private final T t;
public A(final T t) {
this.t = t;
}
public void printClass() {
// OK, but shows "unchecked cast" warrning.
B<T> b = new B<>((Class<T>) t.getClass());
// Compilation error!
B<T> b = new B<T>(t.getClass());
b.printClass();
}
}
public class B<T> {
private final Class<T> t;
public B(final Class<T> t) {
this.t = t;
}
public void printClass() {
System.out.println(t);
}
}
U u
已经是一个T
,因为U
继承自T
。所以一个Consumer<T>
应该随时接受一个U
!只需删除强制类型转换即可。如果您遇到其他问题,请说明原始问题。 - Nándor Előd Fekete