java - Java 泛型是一个全有或全无的决定吗?

标签 java generics

<分区>

我有以下代码:

public class Main {
    public static void main(String[] args) {
        Generic generic = new Generic<Integer>(5);
        List<String> stringList = generic.getStringList(); // this line is where the compiler complains
    }
}

public class Generic<T> {
    private T member;

    public Generic(T member) {
        this.member = member;
    }

    public T getMember() {
        return member;
    }

    public List<String> getStringList() {
        return new ArrayList<String>();
    }
}

注意类Generic使用泛型类型参数声明,但变量 generic在方法中 main是删除类型,我。 e.没有类型参数。我不明白的是为什么编译器会提示分配了 List<String> 的行:

Warning:(6, 56) java: unchecked conversion
  required: java.util.List<java.lang.String>
  found:    java.util.List

该方法明确返回 List<String> ,独立于类的通用参数。这就是变量 stringList期望。似乎没有在类级别上对变量 generic 使用通用参数关闭所有泛型处理,而不仅仅是根据类的类型参数。

如果重要的话,我正在使用标准的 Oracle Java 1.7.0_55 编译器。

我不是在问如何摆脱警告。我知道我应该将变量类型声明为 Generic<Integer> , 或者可以使用 @SuppressWarnings("unchecked") .我的问题如下:

是否记录了此行为?

这种奇怪行为的原因是什么?

最佳答案

当您使用删除类型时,它会删除泛型的所有痕迹 - 而不仅仅是类型参数 T 的使用。所以你的 generic 变量就好像它指的是这种类型:

// After type erasure
public class Generic {
    private Object member;

    public Generic(Object member) {
        this.member = member;
    }

    public Object getMember() {
        return member;
    }

    public List getStringList() {
        return new ArrayList();
    }
}

这记录在 JLS 中 - 从 section 4.6 开始并点击链接。它可能没有那么清晰,但记录在案。

原因是,如果您使用的是原始类型,编译器希望您根本不知道泛型——因为它很可能正在编译遗留的 Java-5 之前的代码。随着时间的推移,这被证明有点不切实际,但我相信这是规范保持现状的动机。

关于java - Java 泛型是一个全有或全无的决定吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26551894/

相关文章:

java - datasnapshot 没有从 firebase 获得值(value)

java - 解析博客文章

Java 正则表达式 - 恰好有一个空格的表达式

用于 LinkedList 的 Java compareTo

generics - "generic parameters of trait function"和 "generic parameters of trait"有什么区别?

Java 通用列表给了我警告

java - Android java.net.SocketException : socket failed: EACCES (Permission denied) while inserting value into sql server through Web service

c# - 通过 C# 中扩展方法的反射获取泛型重载

java - 抽象方法中的通用列表

C# 是具有泛型类型约束的泛型类型