Java泛型基础知识

时间:2013-11-13 13:18:39

标签: java generics

我正在学习使用泛型类型的java编程,并且得到了一个非常基本的问题。

另外两个片段的区别在哪里?

1)

public void build(House house) {
    // work only with house objects that extending House
}

2)。

public <T extends House> void build(T house) {
    // work only with house objects that extending House
}

3 个答案:

答案 0 :(得分:5)

这两种方法在它们作为参数可以采用的方面没有区别;但是,在后一个示例中,可以访问特定类型T。无论如何,这个例子并没有说明泛型的力量。

作为示例,请考虑LinkedListNode<T>个对象。我们可以定义一个包装器Node<T>,它可以容纳任何类型的对象。这是一个非常有用的结构,因为它允许我们编写一段可用于许多不同对象的代码。

答案 1 :(得分:1)

不同之处在于,在第二个函数中,您可以访问类型类型T,即调用者用于访问方法的类型。

然而,我无法想出任何方式使用与直接使用House有意义的那种类型。它可能与该方法的其他一些参数或返回类型有所不同。

答案 2 :(得分:0)

它们在逻辑上是一样的。

虽然,在第二种情况下,编译器可以进行一些高级验证。

假设有两个House的子类叫做XHouse和YHouse。

我们有以下源代码:

XHouse house = build(yHouse)

如果yHouse是YHouse类型的对象且YHouse不是XHouse的子类,则会失败。

将通用视为一种模板。填充泛型参数时,您可以创建一个新方法。在上面的示例中,泛型方法的用法实际上是在创建以下内容:

public XHouse void build(XHouse house) {
    // work only with XHouse objects that extending XHouse
}

注意我甚至改变了评论。