簡體   English   中英

如何使接口擴展與通用參數兼容?

[英]How can I make extensions of interfaces compatible with generic parameters?

跟進這個問題 ,但我會盡力使它成為獨立的。

假設我有一個名為Animal的接口,由於各種原因,該接口具有一個表示實現類的通用類型參數:

public interface Animal<A extends Animal<A>>

我還有一個子接口Dinosaur ,其行為方式相同:

public interface Dinosaur<D extends Dinosaur<D>> extends Animal<D>

現在我有一個實現Animal Lizard類:

public class Lizard implements Animal<Lizard>

還有一個實現了Dinosaur的子類Trex

public class Trex extends Lizard implements Dinosaur<Trex>

這四個聲明現在產生一個錯誤。 這是因為Trex類兩次實現了Animal接口,但是具有不同的類型參數:由於它擴展了Lizard ,因此實現了接口Animal<Lizard> ,並且由於實現了Dinosaur<Trex> ,因此實現了Animal<Trex>

即使TrexLizard的子類, Animal<Trex>也不是Animal<Lizard>的子接口,因此我們會遇到編譯器錯誤。

我確定使用通配符可以解決此問題,但是我無法弄清楚它是什么。

您可以編譯以下內容以獲得相同的錯誤:

public class InterfaceTest
{
  private interface Animal<A extends Animal<A>> {}

  private interface Dinosaur<D extends Dinosaur<D>> extends Animal<D> {}

  private class Lizard implements Animal<Lizard> {}

  private class Trex extends Lizard implements Dinosaur<Trex> {}
}

這是因為Trex類兩次實現了接口Animal,但是具有不同的類型參數

是的,確實是這種情況,並且無法直接解決-這是一個技術限制,因為泛型是使用擦除來實現的。 您永遠不能在具有不同通用參數的多個類上實現同一接口。 當泛型類型被刪除時,您將最終以相同的方式擴展兩個接口,無法區分使用這些不同泛型類型的方法,因此運行時也無法確定執行哪種方法。

對於您的特定用例,可能有一種解決方法,這意味着您不必使用不同的類型參數來實現相同的接口,但是如果沒有更多細節,就無法說出可能的含義。

編輯:查看鏈接的問題,看起來您可以通過使用以這種方式指定返回值而不是在類中聲明返回值的另一個答案(您尚未接受的答案)來解決此問題:

public <T extends JNumber> T add(T addend);

然后,這應該意味着您不需要在類和接口上聲明泛型類型參數,因此也就不會出現此問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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