具有有界通配符的Java Generic

时间:2014-02-17 07:40:32

标签: java generics

类声明之间有什么区别

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>>

我正在尝试学习泛型,并且感谢任何帮助。

1 个答案:

答案 0 :(得分:6)

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

让我们通过一个例子来理解这一点。假设我们有一个实现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>> { }

在使用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满足边界。