gpt4 book ai didi

generics - 为什么泛型类型的实例类与泛型类型类不一样?

转载 作者:行者123 更新时间:2023-12-02 22:11:07 24 4
gpt4 key购买 nike

编辑:更简单的例子:

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();
}

Incompatible types.

Required: Class<T>

Found: 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: incompatible types: java.lang.Object cannot be converted to 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);
}
}

最佳答案

来自 getClass 的文档:

The actual result type is Class<? extends |X|> where |X| is the erasure of the static type of the expression on which getClass is called.

t的静态类型是 T ,删除它就是 Object 。这意味着t.getClass()具有静态类型 Class<? extends Object> ,不是Class<? extends T>正如您所期望的。

t.getClass()具有静态类型 Class<? extends Object> ,编译器只知道 t.getClass().cast(u)Object ,不是T 。这意味着您无法将其传递给 consumer.accept .

关于generics - 为什么泛型类型的实例类与泛型类型类不一样?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41194191/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com