类声明之间有什么区别

public abstract class Super1<T extends Super1<T>> {...}


public abstract class Super2<T extends Super2<? super T>> {...}

使用第一种方法,我能够创建一个子类(类似于Java中的Enum类型)
public class Sub1 extends Super1<Sub1> {...}

但我想知道像2nd这样的超类声明是否完全可能..,它有什么意义,但是我无法创建像
public class Sub2 extends Super2<Object> {...}

我以为Object可以用作T的超级类型?我能想到的另一种形式是
public abstract class Super3<T extends Super3<? extends T>>

我正在尝试学习泛型,对您的帮助将不胜感激。

最佳答案

当您通过继承处理自引用泛型类型时,通常会出现这些类型的声明。此处的关键字是-自引用继承

让我们通过一个例子来理解这一点。假设我们有一个实现CarComparable<Car>类,以及Car的子类-Mercedes:

class Car implements Comparable<Car> { ... }
class Mercedes extends Car { }

现在,您还希望Mercedes具有可比性,因此您可能认为让我们在此处实现一个Comparable<Mercedes>,然后执行以下操作:
class Mercedes extends Car implements Comparable<Mercedes> { }

..那里有个错误。问题是,现在Mercedes类同时实现了Comparable<Car>Comparable<Mercedes>,这是不允许的。

进一步阅读:
  • Can a class implement different instantiations of the same generic interface?

  • 因此,您从此处删除该Comparable<Mercedes>。现在剩下实现MercedesComparable<Car>类。

    然后创建一个类,该类使用如下所示的自引用类型参数:
    class Garage<T extends Comparable<T>> { }
    

    在创建实例时,同时使用CarMercedes,您会这样:
    Garage<Car> carComp = new Garage<Car>();
    Garage<Mercedes> mercedesComp = new Garage<Mercedes>();
    

    您能发现错误吗?是的,它在第二个声明中。不能使用Mercedes类型参数,因为它不满足T extends Comparable<T>的范围。由于Mercedes实现了Comparable<Car>。那么现在该怎么办?

    这是该声明的使用。让我们将类Garage更改为以下内容:
    class Garage<T extends Comparable<? super T>> { }
    

    ..然后您的2实例化将成功通过,因为现在Mercedes满足了边界。

    09-08 03:04