簡體   English   中英

Java通用返回類型問題

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM