下面的构建方法会创建一个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;
}
答案 0 :(得分:1)
泛型在运行时不存在。它们仅在编译时使用,以允许您的代码通过避免强制转换来尽可能避免在运行时尽可能多的ClassCastException
。但是在运行时,属于泛型类的对象类型只是原始类型。
这意味着如果你的Member
类不是通用的,因为编译器不能告诉它返回了什么类型的List
,使用它和使用原始类型之间没有区别。
通用方法是对参数类型和返回类型之间或者一个参数的类型与另一个参数之间的关系施加特定约束。在这种情况下,您在参数列表中没有提及泛型类型U.所以从本质上讲,它什么都不检查。