在下面的源代码中,为什么方法
WParam.unwrap(…)
的返回类型会受到类型参数<X>
的影响,即使它没有在任何地方使用?
public class TestClass {
void test() {
final Long val1 = new Simple().unwrap(new Wrapper<>(5L)); // OK
final Long val2 = new WParam().unwrap(new Wrapper<>(5L)); // ERROR: Object cannot be converted to Long
final Long val3 = new WParam<>().unwrap(new Wrapper<>(5L)); // OK
final Long val4 = new WParam<Byte>().unwrap(new Wrapper<>(5L)); // OK
}
}
record Wrapper<O>(O obj) {}
class Simple {
public <T> T unwrap(Wrapper<T> wrapper) {
return wrapper.obj();
}
}
class WParam<X> {
public <T> T unwrap(Wrapper<T> wrapper) {
return wrapper.obj();
}
}
那么为什么
final Long val3 = new WParam<>().unwrap(new Wrapper<>(5L))
有效,而 final Long val2 = new WParam().unwrap(new Wrapper<>(5L));
却不起作用?
归根结底,
new WParam()
是一个原始类型,因此会丢失所有类型信息。所有未在静态上下文中使用的类型都会被擦除,即使是那些不属于类定义中的类型参数的类型。
这就是为什么
unwrap
的返回类型实际上是 Object
并且不能转换为 Long
,正如异常告诉你的那样。
有关更多信息,请查看什么是原始类型以及为什么我们不应该使用它?