简而言之:为什么我不能用 Java 编写以下代码?
public class Foo<T> {
public void foo(Object bar) {
if (bar instanceof T) {
// todo
}
}
}
是的,我知道,泛型有点黑进了 Java。泛型直到 Java 1.5 才出现,泛型类型在运行时丢失。
我也知道,它有一些模式。例如:
public class Foo<T> {
Class<T> clazz;
public Foo(Class<T> clazz) {
this.clazz = clazz;
}
public void foo(Object bar) {
if (clazz.isInstance(bar)) {
// todo
}
}
}
我的问题是,为什么它不由编译器自动完成?
对于存在任何通用类型的每个类,编译器可以自动为每个构造函数添加一个(或多个,如果我有更多通用类型)参数,并将这些值绑定(bind)到私有(private)字段。每次,我编写 bar instanceof T
它都可以将其编译为 clazzOfGenericT.isInstance(bar)
。
有什么原因,这没有实现吗?
我不太确定,这不会破坏向后兼容性* - 但是,新的 JVM 语言(如 Scala 或 Kotlin)为什么没有此功能?
*:恕我直言,它可以在不破坏任何向后兼容性的情况下完成。
最佳答案
将功能添加到 Java 的提案进展缓慢,并且有更高优先级的功能。 “他们还没有做到这一点。”
Generics wasn't there until Java 1.5, and the generic type is lost during runtime.
...
My question is, why isn't it automatically done by the compiler?
For each class, where any generic type is present, the compiler could automatically add one (or more, if I have more generic types) parameter for each constructor, and bind those values to private fields.
好吧,现在,您只是在问为什么 Java 不为运行时存储泛型类型信息。你要求具体化。答案是 Java 的泛型是通过删除实现的,这一点你已经知道了。
是的,具体化是可能的,其他语言也可以。是的,也许有一天 Java 也会这样做。也许他们会按照您建议的方式进行操作。或许不是。
像这样的事情最终可以通过 Project Valhalla 来解决。 .
关于java - Java 中 T(泛型)的实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36585185/