繁体   English   中英

具有有界通配符的Java Generic

[英]Java Generic with bounded wildcards

类声明之间有什么区别

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> {...}

但是我想知道是否有可能像第二类这样的超类声明..,它有什么意义,但我无法创建像

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

在创建一个实例,同时使用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满足了界限。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM