这个类声明在Java中意味着什么?

时间:2010-01-14 13:02:04

标签: java generics

我只是学习树和一件我不明白的事情是类声明:

例如:class BinarySearchTree<T extends Comparable<? super T>>

现在,您能否解释一下括号中的内容和“<? super T>”?

你可以推荐我的任何好消息来源吗?感谢。

5 个答案:

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

的子类型(S)

构造<? 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 } 不会给出任何编译器错误。

因此,使用通配符可以最大化该类的效用。