类声明之间有什么区别
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>>
我正在尝试学习泛型,对您的帮助将不胜感激。
最佳答案
当您通过继承处理自引用泛型类型时,通常会出现这些类型的声明。此处的关键字是-自引用和继承。
让我们通过一个例子来理解这一点。假设我们有一个实现Car
的Comparable<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>
,这是不允许的。进一步阅读:
因此,您从此处删除该
Comparable<Mercedes>
。现在剩下实现Mercedes
的Comparable<Car>
类。然后创建一个类,该类使用如下所示的自引用类型参数:
class Garage<T extends Comparable<T>> { }
在创建实例时,同时使用
Car
和Mercedes
,您会这样: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
满足了边界。