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