gpt4 book ai didi

java - java泛型中的一个奇怪错误

转载 作者:行者123 更新时间:2023-11-30 06:36:34 26 4
gpt4 key购买 nike

没关系:

Class<? extends String> stringClass = "a".getClass(); 

但这会出错:

<T> void f(T obj) {
Class<? extends T> objClass = obj.getClass();
}

我知道我可以像这样转换它:

<T> void f(T obj) {
@SuppressWarnings("unchecked")
Class<? extends T> objClass = (Class<? extends T>) obj.getClass();
}

但是为什么会出现前面的错误呢? Java 7 的下一个版本会支持这种用法吗?

编辑

我在处理类型删除方面没有问题,只是把额外的 SuppressWarnings每当我的代码正确但编译器不支持它时。

后面的问题是,SuppressWarnings还不够。当T.getClass() => ? extends T显然很直观,为什么我必须抑制任何警告?

正如您已经在 javadoc 中看到的那样:

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

Object.getClass()当我们谈论 Java 泛型时,这是一个特例。它与只返回 Classs<?> 的声明形式不同。 .不知道Eclipse之类的IDE是怎么实现的,在Eclipse IDE中补全会生成Class<? extends |X|>而不是 Class<?>为你。我想 Object 类中可能有一些神奇的东西来制作基类型,哪个? extends from, be different between derived types。所以,不可能用 Java 语言编写自己的 Object 类,它会返回类似 ? extends |X| 的内容。其中 |X|this.getClass() .但是 Java Object确实如此,因为它是一个特例。

最佳答案

Class代表 JVM 中的一个类,而不是 Java 语言。所以对于 List<String>实际ClassClass<List> .在您的示例中,如果 TList<String> , getClass将返回 Class<? extends List>Object.getClass 中所述API 文档。

关于java - java泛型中的一个奇怪错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4703557/

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