Java泛型和返回类型

AnA*_*ser 9 java generics

我碰到了一些我不理解的东西.当第二个相同的时候,为什么不是每个循环都合法?

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 
       }
    }
}
Run Code Online (Sandbox Code Playgroud)

mik*_*kej 18

由于您的实例变量private SomeInterface someInterface未指定其泛型类型参数,因此禁用所有泛型使用someInterface.这意味着someInterface.getObjects()具有原始返回类型List而不是List<SomeNamedObject>.这是第一个例子不编译的原因.

在第二个示例List<SomeNamedObject> objects = someInterface.getObjects()中,为列表添加显式类型.当您这样做时会看到警告,因为不保证类型安全.如果getObjects()定义为List getObjects()没有type参数,则会出现相同的行为.

  • 如果在`someInterface`的声明中没有指定泛型参数,则`SomeInterface`中的*all*泛型类型将被忽略/禁用,即使它们不依赖于`T`. (5认同)