gpt4 book ai didi

Java:有界类型的 getClass()

转载 作者:搜寻专家 更新时间:2023-10-30 20:53:15 25 4
gpt4 key购买 nike

我在研究泛型时注意到了一些事情。在下面的示例中,doStuff1 编译但 doStuff2 不编译:

public <T extends Foo> void doStuff1(T value) {
Class<? extends Foo> theClass = value.getClass();
}

public <T extends Foo> void doStuff2(T value) {
Class<? extends T> theClass = value.getClass();
}

所以,我查阅了 Object.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.

这让我有点好奇。为什么getClass()要这样设计?如果适用,我可以理解将类型转换为其原始类,但我看不出有什么明显的理由说明为什么他们必须让它也杀死 T。是否有特定的原因为什么它也摆脱了它,或者它只是一种普遍的“让我们摆脱一切,因为它更容易;反正谁会需要它”的方法?

最佳答案

如果getClass()返回 Class<? extends X> ,不会发生任何真正糟糕的事情;实际上它会帮助很多用例。

唯一的问题是,它在理论上是不正确的。如果对象是 ArrayList<String> , 它的 class不能是 Class<ArrayList<String>> - 没有这样的类,只有一个 Class<ArrayList> .

这其实和删除无关。如果有一天 Java 获得完整的具体化类型,getClass()仍应返回 Class<? extends |X|> ;然而应该有一个新的方法,比如getType()可以返回更详细的 Type<? extends X> . (不过,getType 可能会与许多现有的具有自己的 getType 方法的类发生冲突)

目前,自 Class<? extends X>在很多情况下可能会有用,我们可以设计自己的方法来做到这一点

static <X> Class<? extends X> myGetClass(X x){ ... }

但他们不会将这种 hack 放入标准库中是可以理解的。

关于Java:有界类型的 getClass(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18144556/

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