【发布时间】:2010-10-01 17:40:33
【问题描述】:
我有一个遗留类,该类本身不是泛型,但它的方法之一返回类型使用泛型:
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 设为泛型来破坏我的客户端代码。
编辑:我正在为上面示例代码中未列出的另一种方法制作通用的东西。我的问题是关于为什么上述不能完成的教育问题。
【问题讨论】: