20

我无法理解下面两个代码片段之间的区别。有人可以帮我做一个简单的解释吗?

首先,不得不说,我有很多类都扩展了一个名为 的超类BaseEntity,那么下面的片段有什么区别、优点和缺点呢?

// 1
public <T extends BaseEntity> T getName(T t) {
    return t;
}

// 2
public BaseEntity getName(BaseEntity t) {
    return t;
}
4

4 回答 4

25

第一个片段更灵活,因为它保留了T. 假设你有一个子类:

class SubEntity extends BaseEntity {}

在第一种情况下,您可以编写:

SubEntity result = getName(new SubEntity());

但在第二种情况下,您将需要一个演员:

SubEntity result = (SubEntity)getName(new SubEntity());
于 2015-12-09T08:44:54.000 回答
7

使用这两种方法的主要区别是在第二种情况下可能需要强制转换。

假设您有:

public class MyEntity extends BaseEntity {
}

使用第一种方法,您可以拥有类似的东西:

MyEntity myEntity = ...
MyEntity entity = getName(myEntity);

使用第二种方法时,您必须编写:

MyEntity entity = (MyEntity)getName(myEntity);

这是因为您在第一个方法中指定了具体类型。

于 2015-12-09T08:46:49.693 回答
4

我很惊讶在之前的答案中没有人提到这一点,但是两种方法声明之间存在更根本的区别(这就是在第二种情况下需要强制转换的原因)。这种差异与您在此处提供的微不足道的方法无关,但对于执行不同于简单返回其参数的操作的方法而言,它可能会有所不同。

您的第一个方法声明要求返回类型与传入的参数类型相同。所以

public <T extends BaseEntity> T getName(T t) {
    return new SubEntity(); // Where SubEntity extends BaseEntity
}

编译失败而

public BaseEntity getName(BaseEntity t) {
    return new SubEntity(); // Where SubEntity extends BaseEntity
}

即使BaseEntity传入方法的类型与SubEntity.

于 2015-12-09T14:52:14.007 回答
1

1)在您的第一个代码中,您应该有一个返回方法的限制,subclasses并且BaseEntity输入参数必须是相同的子类BaseEntity

2)在您的第二个代码中,您的方法的返回和参数应该subclassesBaseEntity

于 2015-12-09T08:44:07.920 回答