【发布时间】:2017-01-11 08:33:51
【问题描述】:
据我所知,Java 中泛型的主要目的之一是提供编译时类型安全。如果它被编译,代码将毫无问题地运行。
那为什么要编译下面的代码呢?
public static void main(String[] args) {
String s = getList();
}
private static <T extends List> T getList() {
return (T)new ArrayList();
}
它编译得很好。我的类型安全编译在哪里? getList() 方法与 String 类没有任何共同之处。
【问题讨论】:
-
不,即使使用非原始类型也会编译。
-
@MarkusFischer,我也想过,但是编译器意识到String是final类,不能有任何子类
-
@MarkusFischer,您应该将此评论转换为答案。我认为这正是在这里观察到的问题。
MyClass extends String implements List可能在编译时是可能的,因为编译器不认为 String 是final,正如你所说,对于那些通用检查。 -
@AndrewTobilko 编译器只查看 type,而不查看类型是否为 final。 Final 阻止声明子类,但不阻止编译器允许子类的可能性(google Liskov)。换句话说,从(非子类化)类中添加或删除 final 不应该在它们的使用中导致编译失败。类型并没有改变,只是对子类的限制,这是一个实现的东西,而不是一个类型的东西。
-
"如果它被编译,代码将毫无问题地运行。"不会。编译时会收到警告,告诉您它可能不起作用。
标签: java string generics type-safety generic-type-argument