Generics 为什么泛型类型实例的类与泛型类型类不同?

Generics 为什么泛型类型实例的类与泛型类型类不同?,generics,java-8,generic-type-argument,Generics,Java 8,Generic Type Argument,编辑:更简单的示例: 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(); } 从以下文件:

编辑:更简单的示例:

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();
}
从以下文件:


实际结果类型为
ClassI-see。你会如何处理这个问题呢
@SuppressWarnings
?@Jezor:这取决于您的实际用例。通常,你甚至不应该处于这种情况
Class.cast
很奇怪,很少有必要。在您的示例中,
Class.cast
U
都是多余的。问题是,实际的用例要复杂得多,所以我想发布尽可能少的示例。@Jezor:新示例不太正确,因为如果
t
t
的子类的实例,那么
t.getClass()
,而不是
。不过,如果你纠正了这个问题,我会说这是一个未经检查的演员和一个<代码> @ SuppressWarnings(“未选中”)。你也可以考虑把<代码>类< /C>作为一个明确的参数,而不是调用<代码> GETCase(并且可能得到一个子类)。从编译器的角度来看,code>U
已经是
T
,因为
U扩展了T
,所以
消费者
应该随时接受
U
!只要去掉演员阵容,开心一点,或者如果这是你正在努力解决的其他问题,请描述你原来的问题。@NándorElődFekete为了澄清,我添加了一个更复杂的例子,与我的问题更密切相关。
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));
    }
}
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);
    }
}