下面的构建方法创建 TypedMemberDTO
的实例.
TypedMemberDTO
可以包含输入的 List
Member.getDetails
返回 Object
类型,我知道在运行时它只是两种类型之一。除了扩展 Object
之外,这些类型没有任何共同点。 .
我想要做的是创建一个使用泛型来设置 TypedMemberDTO
中的详细信息的构建方法。 .
代码编译良好,运行良好,尽管我对 <U>
的内容有点困惑打字实际上为我提供了帮助。
实际上,如果我在这里使用原始类型而不是 <U>
,我会获得相同的编译时间优势吗?
有没有更好的方法来编写构建方法?
public class TypedMemberDTO<T> extends MemberDTO {
private List<T> details;
public List<T> getDetails() {
return details;
}
public void setDetails(List<T> details) {
this.details = details;
}
}
public <U> TypedMemberDTO<?> build(Member member, String attributeName) {
TypedMemberDTO<U> typedMemberDTO = new TypedMemberDTO<U>();
List<U> dtos = (List<U>) member.getDetails(attributeName);
typedMemberDTO.setDetails(dtos);
return typedMemberDTO;
}
最佳答案
泛型在运行时不存在。它们仅在编译时使用,以允许您的代码通过避免强制转换来在运行时避免尽可能多的 ClassCastException
。但在运行时,属于泛型类的对象类型只是原始类型。
这意味着,如果您的 Member
类不是通用的,因为编译器无法判断它返回了哪种 List
,那么使用它和使用它没有区别原始类型。
泛型方法对参数类型和返回类型之间或一个参数类型和另一个参数类型之间的关系施加特定的约束。在这种情况下,参数列表中没有提及泛型类型 U。所以本质上,它什么也不检查。
关于java - 与原始类型相比,了解方法上的泛型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26371418/