当前我遇到了Java中泛型类的问题。
我有这样的事情:
public class GenericClass<T> {
T doSomething() {...}
Collection<String> getCollection() {...}
}
现在我在没有type参数的情况下实例化该类的对象,因为我没有参与其中,或者我不知道它。
GenericClass obj = new GenericClass();
for (String str : obj.getCollection() { // won't work
...
}
问题是,编译器不是简单地丢弃有关type-parameter的信息,而是关于Collection(String)的类型,尽管它独立于参数。
我做错了什么,或者是对Java的限制?如果是这样,为什么这是限制?
答案 0 :(得分:4)
你做错了什么。
如果您不知道T
类型,则应使用通配符:GenericClass<?>
。但是,在实例化新的GenericClass
时,您无法执行此操作,因此只需使用Object
:
GenericClass<?> obj = new GenericClass<Object>();
出于向后兼容的原因,故意根本没有任何通用信息的类(GenericClass
没有任何<>
)会失去所有泛型类型的安全性,因此它可以安全地使用预通用代码。
答案 1 :(得分:4)
以下代码完美无缺。不是直接从obj.getCollectionn()
中提取值,而是最好将其存储到某个Collection
变量中,然后再访问它。
GenericClass obj = new GenericClass();
Collection<String> c = obj.getCollection();
for (String string : c)
{
//Some complex Code
}
答案 2 :(得分:0)
创建泛型类型的实例而不指定类型参数是一种只能由遗留代码完成的实践。您正在编写的任何新代码都不应该这样做。这是使用“原始类型”调用的,并且会破坏您首先编写泛型类的所有编译时类型安全性。
另外,请注意我希望您也会发现有用的内容:如果您计划在Collection框架中使用自己的基于值的类实例,那么您需要考虑提供一个良好的行为equals()和hashcode()的实现。不执行此操作(并依赖于equals()和hashcode()的Object类的默认行为)可能意味着您的对象在您的集合中无法正常运行。