2

currenty I'm facing a problem with generic classes in Java.

I have something like this:

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

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

Now I instantiate an object of that class without the type parameter, since I'm not intereseted in that or I don't know it.

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

The problem is, that the compiler does not simply throw away the information about the type-parameter, but also about the type of the Collection (String), although that's independent from the parameter.

Am I doing something wrong, or is that a restriction of Java? If so, why is that a restriction?

4

3 回答 3

4

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

GenericClass obj = new GenericClass();
Collection<String> c = obj.getCollection();
for (String string : c) 
{
    //Some complex Code
}
于 2013-05-20T17:13:29.700 回答
4

你做错了什么。

当您不知道T类型时,您应该只使用通配符: GenericClass<?>。但是,当您实例化一个 new 时GenericClass,您不能这样做,所以只需使用Object

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

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

于 2013-05-20T17:06:51.453 回答
0

在不指定类型参数的情况下创建泛型类型的实例是一种只能由遗留代码完成的做法。您正在编写的任何新代码都不应该这样做。这被称为使用“原始类型”,它损害了您首先编写泛型类的所有编译时类型安全性。

另外,我希望您也能从中得到帮助:如果您打算在 Collection 框架中使用自己的基于值的类实例,则需要考虑提供一个表现良好的 equals 实现。 () 和哈希码()。不这样做(并且依赖于 Object 类的 equals() 和 hashcode() 的默认行为)可能意味着您的对象在您的集合中无法正常运行。

于 2013-05-20T17:21:03.877 回答