简而言之:为什么我不能用Java编写以下代码?
public class Foo<T> {
public void foo(Object bar) {
if (bar instanceof T) {
// todo
}
}
}
Run Code Online (Sandbox Code Playgroud)
是的,我知道,仿制药有点被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
}
}
}
Run Code Online (Sandbox Code Playgroud)
我的问题是,为什么它不是由编译器自动完成的?
对于存在任何泛型类型的每个类,编译器可以为每个构造函数自动添加一个(或更多,如果我有更多泛型类型)参数,并将这些值绑定到私有字段.每次,我写bar instanceof T它可以编译为clazzOfGenericT.isInstance(bar).
有什么理由,这没有实现?
我不完全确定,这不会破坏向后兼容性* - 但是,新的JVM语言(如Scala或Kotlin)为何没有这个功能?
*:恕我直言,它可以完成,不会有任何向后兼容性.
关于添加到 Java 的功能的提案进展缓慢,并且存在更高优先级的功能。“他们还没有做到这一点。”
泛型直到 Java 1.5 才出现,并且泛型类型在运行时会丢失。
...
我的问题是,为什么编译器不自动完成它?
对于存在任何泛型类型的每个类,编译器可以自动为每个构造函数添加一个(或多个,如果我有更多泛型类型)参数,并将这些值绑定到私有字段。
好吧,现在,您只是想问为什么 Java 不存储运行时的泛型类型信息。你要求具体化。答案是Java的泛型是通过擦除来实现的,这一点你已经知道了。
是的,具体化是可能的,其他语言也可以做到。是的,也许有一天 Java 也会这么做。也许他们会按照你建议的方式去做。或者可能不是。
| 归档时间: |
|
| 查看次数: |
457 次 |
| 最近记录: |