我有一个遗留类,该类本身不是泛型,但其中一个方法的返回类型使用了泛型:
public class Thing {
public Collection<String> getStuff() { ... }
}
getStuff()
使用泛型来返回一个字符串集合。因此,我可以遍历getStuff()
,而不需要将元素强制转换为String
:
Thing t = new Thing();
for (String s: t.getStuff()) // valid
{ ... }
然而,如果我将
Thing
本身更改为通用类型但保持其他所有内容不变:public class Thing<T> {
public Collection<String> getStuff() { ... }
}
然后继续使用非泛型引用Thing
,getStuff()
不再返回Collection<String>
,而是返回一个非类型化的Collection
。因此客户端代码无法编译:
Thing t = new Thing();
for (String s: t.getStuff()) // compiler complains that Object can't be cast to String
{ ... }
为什么会这样?有什么解决方法吗?
我猜测是因为使用非通用引用来引用通用类,Java会关闭整个类的所有泛型。这很麻烦,因为现在我通过将Thing变成通用类而破坏了客户端代码。
编辑:我正在为另一个未在上面示例代码中列出的方法使Thing变成通用类。我的问题是教育性质的,即为什么上述操作不可行。