方法的返回类型受到类的类型参数的影响,尽管类型参数没有在任何地方使用。为什么?

问题描述 投票:0回答:1

在下面的源代码中,为什么方法

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();
    }
}
java generics type-inference
1个回答
0
投票

那么为什么

final Long val3 = new WParam<>().unwrap(new Wrapper<>(5L))
有效,而
final Long val2 = new WParam().unwrap(new Wrapper<>(5L));
却不起作用?

归根结底,

new WParam()
是一个原始类型,因此会丢失所有类型信息。所有未在静态上下文中使用的类型都会被擦除,即使是那些不属于类定义中的类型参数的类型。

这就是为什么

unwrap
的返回类型实际上是
Object
并且不能转换为
Long
,正如异常告诉你的那样。

有关更多信息,请查看什么是原始类型以及为什么我们不应该使用它?

© www.soinside.com 2019 - 2024. All rights reserved.