通用 super class 和 super class 类型的区别
Difference between generic super class and super class type
我无法理解下面两个代码片段之间的区别。谁能帮我简单解释一下?
首先,我不得不说,我有很多classes扩展了一个名为BaseEntity
的超级class,那么有什么区别,优点和缺点以下片段中的哪些?
// 1
public <T extends BaseEntity> T getName(T t) {
return t;
}
// 2
public BaseEntity getName(BaseEntity t) {
return t;
}
1) 在你的第一个代码中你有一个 return 方法的限制应该是 BaseEntity
的 subclasses
并且输入参数必须是 BaseEntity
的相同子类.
2) 在你的第二个代码中你有 return 并且方法的参数应该是 BaseEntity
.
的 subclasses
第一个片段更灵活,因为它保留了 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);
这是因为您在第一个方法中指定了具体类型。
令我惊讶的是,之前的答案中没有人提到这一点,但是这两种方法声明之间存在更根本的区别(这就是第二种情况需要强制转换的原因)。这种差异与您在此处提供的微不足道的方法无关,但对于执行不同于简单 return 参数的方法可能会有所不同。
您的第一个方法声明要求 return 类型与传入的参数相同类型。所以
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
完全不同的类型。
我无法理解下面两个代码片段之间的区别。谁能帮我简单解释一下?
首先,我不得不说,我有很多classes扩展了一个名为BaseEntity
的超级class,那么有什么区别,优点和缺点以下片段中的哪些?
// 1
public <T extends BaseEntity> T getName(T t) {
return t;
}
// 2
public BaseEntity getName(BaseEntity t) {
return t;
}
1) 在你的第一个代码中你有一个 return 方法的限制应该是 BaseEntity
的 subclasses
并且输入参数必须是 BaseEntity
的相同子类.
2) 在你的第二个代码中你有 return 并且方法的参数应该是 BaseEntity
.
subclasses
第一个片段更灵活,因为它保留了 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);
这是因为您在第一个方法中指定了具体类型。
令我惊讶的是,之前的答案中没有人提到这一点,但是这两种方法声明之间存在更根本的区别(这就是第二种情况需要强制转换的原因)。这种差异与您在此处提供的微不足道的方法无关,但对于执行不同于简单 return 参数的方法可能会有所不同。
您的第一个方法声明要求 return 类型与传入的参数相同类型。所以
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
完全不同的类型。