2

我正在使用泛型类型学习 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
}
4

3 回答 3

5

这两种方法在可以作为参数接受的内容方面没有区别;但是,在后一个示例中,确实可以访问特定的 type T。无论如何,这个例子并没有说明泛型的力量。

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

于 2013-11-13T13:22:02.573 回答
1

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

但是,我想不出任何方式来使用与House直接使用有意义不同的那种类型。它可能会与方法的某些其他参数或返回类型有所不同。

于 2013-11-13T13:26:42.157 回答
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
}

请注意,我什至更改了评论。

于 2013-11-13T13:21:33.690 回答