我正在学习使用泛型类型的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
}
答案 0 :(得分:5)
这两种方法在它们作为参数可以采用的方面没有区别;但是,在后一个示例中,可以访问特定类型T
。无论如何,这个例子并没有说明泛型的力量。
作为示例,请考虑LinkedList
个Node<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
}
注意我甚至改变了评论。