gpt4 book ai didi

java - 为什么泛型参数上的通配符需要显式转换?

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:24:47 27 4
gpt4 key购买 nike

<分区>

我有一个函数:

<T> T get(Class<T> fetchType) {
...
}

所以,如果我要做这样的事情:

String x = get(String.class);

这一切都很好。

然而,在另一个函数中:

<R> R otherFunction(R base) {
return get(base.getClass());
}

给我一​​个错误,因为 base.getClass()返回 ? extends R .

reason: no instance(s) of type variable(s) exist so that capture of ? extends Object conforms to R
inference variable T has incompatible bounds:
equality constraints: capture of ? extends Object upper bounds: Object, R

现在据我了解,函数 get(Class<T> x)返回 T , 所以当用 ? extends R 调用时,假设是 CAP#1 , 但自 get现在返回 CAP#1 , 将其分配给类型 R应该不是问题。为了对此进行测试,我尝试了:

Class<? extends CharSequence> stringClass = String.class;
CharSequence x = get(stringClass);

这似乎没有任何问题。出了什么问题?

编辑:这是因为类型删除,在运行时没有关于 R 的信息吗?可用,但 CharSequence是?这仍然没有意义,因为这不是仅在编译阶段进行的纯粹检查吗?

所以,结果是 Object.getClass()返回 Class<? extends |X|>而不是 Class<? extends X> , 其中|X|是删除 X这就是为什么它适用于具体类型(如 ? extends CharSequence ,但不适用于通用类型)。 IntelliJ 可能没有准确报告,这导致了困惑:http://i.imgur.com/yE8LswM.jpg (我尝试截屏,但弹出窗口一直在消失)。

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