目前,我在Java中遇到通用类问题。
我有这样的事情:
public class GenericClass<T> { T doSomething() {...} Collection<String> getCollection() {...} }
现在,我实例化了一个没有类型参数的类的对象,因为我对此没有兴趣或不知道。
GenericClass obj = new GenericClass(); for (String str : obj.getCollection() { // won't work ... }
问题是,尽管编译器不依赖于参数,但它不仅丢弃有关类型参数的信息,而且还丢弃有关集合(字符串)的类型的信息。
我是在做错什么,还是Java的限制?如果是这样,那为什么会有限制?
你做错了
如果您不知道T类型,则只需使用通配符:
GenericClass<?>。实例化new时,您无法执行此操作GenericClass,因此只需使用Object:
GenericClass<?> obj = new GenericClass<Object>();
出于向后兼容的原因,故意使一个根本没有任何泛型信息(GenericClass没有任何信息<>)的类失去了所有泛型类型安全性,因此可以将其与前泛型代码安全地使用。
GenericClass
<>
以下代码可以正常工作。与其直接从中提取值obj.getCollectionn(),不如将其存储到某个Collection变量然后访问它。
obj.getCollectionn()
Collection
GenericClass obj = new GenericClass(); Collection<String> c = obj.getCollection(); for (String string : c) { //Some complex Code }