我无法理解下面两个代码片段之间的区别。有人可以帮我做一个简单的解释吗?
首先,不得不说,我有很多类都扩展了一个名为 的超类BaseEntity
,那么下面的片段有什么区别、优点和缺点呢?
// 1
public <T extends BaseEntity> T getName(T t) {
return t;
}
// 2
public BaseEntity getName(BaseEntity t) {
return t;
}
我无法理解下面两个代码片段之间的区别。有人可以帮我做一个简单的解释吗?
首先,不得不说,我有很多类都扩展了一个名为 的超类BaseEntity
,那么下面的片段有什么区别、优点和缺点呢?
// 1
public <T extends BaseEntity> T getName(T t) {
return t;
}
// 2
public BaseEntity getName(BaseEntity t) {
return t;
}
第一个片段更灵活,因为它保留了T
. 假设你有一个子类:
class SubEntity extends BaseEntity {}
在第一种情况下,您可以编写:
SubEntity result = getName(new SubEntity());
但在第二种情况下,您将需要一个演员:
SubEntity result = (SubEntity)getName(new SubEntity());
使用这两种方法的主要区别是在第二种情况下可能需要强制转换。
假设您有:
public class MyEntity extends BaseEntity {
}
使用第一种方法,您可以拥有类似的东西:
MyEntity myEntity = ...
MyEntity entity = getName(myEntity);
使用第二种方法时,您必须编写:
MyEntity entity = (MyEntity)getName(myEntity);
这是因为您在第一个方法中指定了具体类型。
我很惊讶在之前的答案中没有人提到这一点,但是两种方法声明之间存在更根本的区别(这就是在第二种情况下需要强制转换的原因)。这种差异与您在此处提供的微不足道的方法无关,但对于执行不同于简单返回其参数的操作的方法而言,它可能会有所不同。
您的第一个方法声明要求返回类型与传入的参数类型相同。所以
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
.
1)在您的第一个代码中,您应该有一个返回方法的限制,subclasses
并且BaseEntity
输入参数必须是相同的子类BaseEntity
。
2)在您的第二个代码中,您的方法的返回和参数应该subclasses
是BaseEntity
。