簡體   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