[英]Java Generic Return type Issue
我在下面的Java代碼中收到一個非常奇怪的編譯錯誤。
我有一個簡單的接口,具有具有通用返回類型的API:
public interface AttributeGenerator {
<T> T generateAttribute(Record record);
}
我可以寫一個實現,這個可以編譯:
public class StringAttributeGenerator implements AttributeGenerator {
@Override
public String generateAttribute(Record record) {
return "Test";
}
}
現在,可以說,我在上面的界面中添加了另一個參數。
public interface AttributeGenerator {
<T> T generateAttribute(Record record, Set<Integer> indices);
}
我提供了另一種實現方式:
public class StringAttributeGenerator implements AttributeGenerator {
@Override
public String generateAttribute(Record record, Set<Integer> indices) {
return "Test";
}
}
編譯失敗,編譯器抱怨:
該方法不會從其超類重寫。
我不明白為什么編譯器不能編譯第二個實例,如果不是,我想理解為什么Java無法為用戶提供編寫此類代碼的便利。
AFAIK問題在於,在第一種情況下,您實際上是在禁用泛型。 在這種情況下,這將導致T
被強制轉換為Object
,並且由於返回類型為協方差,因此返回String
是可以的。 但是,這應該會產生警告,因為您基本上是在迫使編譯器忽略泛型並使用“傳統”方式,這相當於直接編寫Object generateAttribute( Record record )
。
在第二種情況下,如果以上述方法禁用泛型,則簽名將看起來像generateAttribute(Record record, Set indices)
,其中第二個參數等效於Set<Object>
,因此簽名不再匹配。
還要注意,雖然您的第一個代碼段可以編譯,但是您可能會遇到運行時問題,例如,如果您執行了以下操作:
AttributeGenerator unknownGenerator = new StringAttributeGenerator();
//You'd get a string and the system would try to cast to Integer, which clearly will fail
Integer iWontCompile = unknownGenerator.generateAttribute( someRecord );
您可以在接口中定義T
,例如:
public interface AttributeGenerator<T> {
T generateAttribute(Record record, Set<Integer> indices);
}
public class StringAttributeGenerator implements AttributeGenerator<String> {
@Override
public String generateAttribute(Record record, Set<Integer> indices) {
return "Test";
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.