我无法理解下面两个代码片段之间的区别。能否有人用简单的语言给我解释一下?
首先,我必须说我有很多类继承了一个名为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;
}
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) 在您的第一段代码中,您限制了返回方法应该是BaseEntity
的子类
,并且输入参数必须是BaseEntity
的相同子类
。
2) 在您的第二段代码中,方法的返回值和参数应该是BaseEntity
的子类
。
BaseEntity
子类。它不能只是任何类型的对象。在第二个片段中,“返回”值和输入参数也可以是BaseEntity
的子类。 - Daniel