我刚刚遇到一些我不明白的东西.当第二个相同的时候,为什么每个循环都不合法?
public interface SomeInterface<T> { List<SomeNamedObject> getObjects(); void doSomething(P1 p1,T p2); } public class SomeNamedObject { private String text; } public class Clazz { private SomeInterface someInterface; ... public void someMethod() { // Error Type mismatch: cannot convert from element type Object to TestClass.SomeNamedObject for (SomeNamedObject someNamedObject : someInterface.getObjects()) { // This loop won't compile as the someInterface.getObjects returns just a List and not a List<SomeNamedObject> } // Warning Type safety: The expression of type List needs unchecked // conversion to conform to List<TestClass.SomeNamedObject> List<SomeNamedObject> objects = someInterface.getObjects(); for (SomeNamedObject someNamedObject : objects) { // This loop compiles } } }
解决方法
因为您的实例变量private SomeInterface someInterface不指定其通用类型参数,所以对于someInterface,所有使用泛型都将被禁用.这意味着someInterface.getObjects()具有原始返回类型List而不是List< SomeNamedObject> ;.这是第一个例子没有编译的原因. 在第二个示例List< SomeNamedObject> objects = someInterface.getObjects()正在为列表添加显式类型.当您执行此操作时,您会看到警告,因为类型安全性不能保证.如果getObjects()被定义为没有type参数的List getObjects(),那么这将是你看到的一样的行为.