java - 与原始类型相比,了解方法上的泛型

标签 java generics

下面的构建方法创建 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/

相关文章:

java - 我可以内联这些流运算符序列吗?

java - 为什么时区模式 "OOOO"不显示完整的 GMT+00 :00 offset format?

java - Java “Foo f = new Foo() ”中的对象初始化是否与在C中将malloc用作指针相同?

java - 如何创建一个 T 类型的新对象

java - 对扩展现有枚举类型的泛型感到困惑

java - Spring boot-1.5.8 应用程序中的 Logback 从 1.1.11 升级到 1.3.0-alpha4

java - 使用和不使用 new 运算符创建 java 字符串之间的区别

Scala:枚举值的通用解析器

scala - 如何修复 Scala 中的这种类型不匹配错误?

java - 将类文字作为交集类型返回