tangguo

具有其他类型的Collection getter的泛型类

android

目前,我在Java中遇到通用类问题。

我有这样的事情:

public class GenericClass<T> {
    T doSomething() {...}

    Collection<String> getCollection() {...}
}

现在,我实例化了一个没有类型参数的类的对象,因为我对此没有兴趣或不知道。

GenericClass obj = new GenericClass();
for (String str : obj.getCollection() { // won't work
    ...
}

问题是,尽管编译器不依赖于参数,但它不仅丢弃有关类型参数的信息,而且还丢弃有关集合(字符串)的类型的信息。

我是在做错什么,还是Java的限制?如果是这样,那为什么会有限制?


阅读 251

收藏
2020-11-09

共2个答案

一尘不染

你做错了

如果您不知道T类型,则只需使用通配符:

GenericClass<?>。实例化new时,您无法执行此操作GenericClass,因此只需使用Object:

GenericClass<?> obj = new GenericClass<Object>();

出于向后兼容的原因,故意使一个根本没有任何泛型信息(GenericClass没有任何信息<>)的类失去了所有泛型类型安全性,因此可以将其与前泛型代码安全地使用。

2020-11-09
一尘不染

以下代码可以正常工作。与其直接从中提取值obj.getCollectionn(),不如将其存储到某个Collection变量然后访问它。

GenericClass obj = new GenericClass();
Collection<String> c = obj.getCollection();
for (String string : c) 
{
    //Some complex Code
}
2020-11-09