跟进这个问题,但我会尽量让它自成一体。
假设我有一个名为 的接口Animal
,由于各种原因,它有一个表示实现类的泛型类型参数:
public interface Animal<A extends Animal<A>>
我还有一个子接口 ,Dinosaur
它的行为方式相同:
public interface Dinosaur<D extends Dinosaur<D>> extends Animal<D>
现在我有一个Lizard
实现的类Animal
:
public class Lizard implements Animal<Lizard>
和一个子类Trex
,它实现Dinosaur
:
public class Trex extends Lizard implements Dinosaur<Trex>
这四个声明现在产生错误。这是因为该类Trex
实现了接口Animal
两次,但使用了不同的类型参数:因为它 extends Lizard
,它实现了 interface Animal<Lizard>
,并且因为它 implements Dinosaur<Trex>
,它实现了Animal<Trex>
。
Animal<Trex>
不是 的子接口Animal<Lizard>
,即使Trex
是 的子类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> {}
}