[英]Java Generics and return types
我碰到了一些我不理解的东西。 当第二个相同的时候,为什么不是每个循环都合法?
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()
则会出现这种情况。
您应该注意,当您在第二个循环之前对象对象时,会收到编译器警告。
Type safety: The expression of type List needs unchecked conversion to conform to
List<TestClass.SomeNamedObject>
这会告诉你,由于某种原因你的getObjects()方法返回一个非泛化的List。 这解释了为什么第一个循环不能编译。
因为你忘记了你的参考:
private SomeInterface someInterface;
如果你不通知它,一切都将使用原始类型,包括声明的方法的签名。 意味着它返回一个原始List对象而不是List <SomeNamedObject>做类似的事情
private SomeInterface<Object> someInterface;
它应该工作。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.