繁体   English   中英

Java泛型和返回类型

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM