- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
类声明有什么区别
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 这样的父类(super class)声明......它有什么意义,但我无法创建像这样的子类
public class Sub2 extends Super2<Object> {...}
我认为 Object 可以用作 T
的父类(super class)型??我能想到的另一种形式是
public abstract class Super3<T extends Super3<? extends T>>
我正在尝试学习泛型,感谢任何帮助。
最佳答案
当您处理具有继承的自引用泛型类型时,这些类型的声明通常会出现。这里的关键字是 - Self-Referential 和 inheritance。
让我们通过一个例子来理解这一点。假设我们有一个类 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>
.那么现在该怎么办呢?
这里是该声明的用法。让我们改变你的类(class)Garage
像这样:
class Garage<T extends Comparable<? super T>> { }
.. 然后你的 2 实例化将成功通过,就像现在一样 Mercedes
满足边界。
关于具有有界通配符的 Java 泛型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21823315/
我是一名优秀的程序员,十分优秀!