我只是学习树和一件我不明白的事情是类声明:
例如:class BinarySearchTree<T extends Comparable<? super T>>
。
现在,您能否解释一下括号中的内容和“<? super T>
”?
你可以推荐我的任何好消息来源吗?感谢。
答案 0 :(得分:16)
这声明了一个具有单个泛型类型参数的类。因为对于二叉搜索树,它必须比较两个项,这需要指定,以便编译器可以验证它。
尖括号中的部分是类型参数T
,它的约束是:
T
是什么,它都应该延伸Comparable
(<T extends Comparable<...>>
)。Comparable
应该能够将自己与T
或超级T
(<? super T>
)进行比较。由于T
通常可以是任何内容,因此会限制对实现搜索树有意义的类型的选择。
答案 1 :(得分:4)
<? super T>
表示?
是T
的父级。如果?
已知(例如X
),您可以使用<T extends X>
编辑:这是Java Generic的良好来源:http://java.sun.com/j2se/1.5/pdf/generics-tutorial.pdf
答案 2 :(得分:1)
&lt;&gt;括号用于所谓的泛型。这很像C ++中的模板,并且您可以创建一个可以强类型化的单个数据结构。例如,ArrayList对象使用泛型来定义ArrayList中的项目类型:
ArrayList<String> - an ArrayList containing Strings
ArrayList<MyClass> - an ArrayList containing MyClass objects
当您定义使用泛型的结构时,您可以使用上面的表示法。 “T”是某个类的占位符,在实例化类并给出类型时填充该类。例如,ArrayList的定义可能如下所示:
public class ArrayList<T> ...
最简单的方法是简单地使用MyGeneric<T>
并让任何类使用。但是,有时您只希望gereric与某个继承结构中的类一起使用。在这种特定情况下,Comparable<? super T>
意味着这将是一个扩展Comparable的对象Compares匹配T的任何类型的对象或者是T的超类。
答案 3 :(得分:0)
Sun的Tutorial是开始学习通配符和泛型的好地方。
Java Ranch对Java“Greenhorns”也非常有用。
答案 4 :(得分:0)
短语<? super T>
是一个通配符,暗示,类 BinarySearchTree 可以采用:
a。扩展可比较的类型参数(T)
b。并且还可以采用其父扩展Comparable
构造<? super T>
扩展了类 BinarySearchTree 的实用程序
实现 Comparable 及其子类型的类型。
以下代码段演示了这一点:
// Below declaration of Helper class doesn't uses the wildcard super
class Helper<T extends Comparable<T>> {
// some helper methods
}
abstract class Animal implements Comparable<Animal> {
public int compareTo(final Animal o) {
// implementation ...
}
// other abstract methods
}
class Mammal extends Animal {
// implement abstract methods
}
// Below declaration of Helper class doesn't uses the wildcard super
class Helper<T extends Comparable<T>> {
// some helper methods
}
abstract class Animal implements Comparable<Animal> {
public int compareTo(final Animal o) {
// implementation ...
}
// other abstract methods
}
class Mammal extends Animal {
// implement abstract methods
}
根据上述声明,声明正常工作
但声明:
Helper<Animal> x = new Helper<Animal>()
给出了编译错误
类型参数Mammal不在其范围内
(编译器版本是javac 1.5.0_06)
当类Helper的声明更改为以下形式时:
Helper<Mammal> x = new Helper<Mammal>()
然后语句class Helper<T extends Comparable<? super T>> {
// some helper methods
}
class Helper<T extends Comparable<? super T>> {
// some helper methods
}
不会给出任何编译器错误。
因此,使用通配符可以最大化该类的效用。