具有独立于泛型类型的泛型方法的原始类型
这是chrert的问题的后续跟其他类型的Collection getter的泛型类。 如果您能为我的问题想出更好的标题,请随时编辑它:
下面的代码包含一个带有返回类型T
的方法的泛型类GenericClass<T>
,以及返回类型为Collection<String>
另一个方法,这显然与T
无关。
现在,如果我实例化一个原始GenericClass
(我永远不会这样做,所以这个问题更多的是一个理论问题,以帮助理解发生了什么),那么在增强for循环中调用该方法将不起作用,因为所有泛型类型信息在使用原始类型时似乎会丢失。 但是,当在一个任务中调用同样的方法时,它会起作用(它警告类型不安全,但会编译)。
在我看来,两者都不应该工作,或两者都应该工作。 我不明白为什么一个人工作,而另一个不是。 你有没有提示,或者知道解释这种行为的JLS的任何部分?
public class GenericClass<T> {
T doSomething() {
return null;
}
Collection<String> getCollection() {
return Collections.emptyList();
}
public static void main(String[] args) {
GenericClass raw = new GenericClass();
// This will not compile (Error message below)
for (String str : raw.getCollection()) {
// Type mismatch: cannot convert from element type Object to String
}
// This is only a warning:
// Type safety: The expression of type Collection needs unchecked conversion to conform to Collection<String>
Collection<String> coll = raw.getCollection();
for (String string : coll) {
// works just fine
}
}
}
这里有一个相关的问题,它和这里公认的答案一起解释了很好的结果:为什么不能编译这个通用的java代码?
在第一种情况下, raw.getCollection()
返回一个原始Collection
。 JLS 14.14.2规定了增强for
循环的类型检查:
如果类型(在形式参数生产中)是引用类型,则TargetType是类型; 否则,TargetType是I的类型参数的捕获转换的上限, 如果我是raw , 则为Object。
(强调加)
在第二种情况下,你明确地将一个原始类型分配给一个泛型类型,这可以使用正常的警告。
链接地址: http://www.djcxy.com/p/71613.html上一篇: Raw types with generic methods independent of the generic type
下一篇: Org.json.JSONException: Unterminated string at character 1834