Java 编译器如何知道所使用的类是泛型类,尽管它已被编译并且其类型已被擦除为预泛型代码

Java 编译器如何知道所使用的类是泛型类,尽管它已被编译并且其类型已被擦除为预泛型代码,java,generics,Java,Generics,我知道,如果我使用泛型方法或泛型类作为原始类型,而我的代码尚未编译,编译器会警告我不要将其作为原始类型使用 但是,如果我单独编译一个泛型代码,然后在我的新项目中使用这个编译过的类,那么编译器到底是如何警告我的呢 给定的类是泛型的,应该将其参数化。由于类型擦除,.class文件是纯泛型前代码,它不能知道它是否为泛型 为了更清楚地说明我的观点,如果在我的md.jar中有一个已编译的泛型类Employee,并且已经为它生成了一个预泛型类fileEmployee.class 现在,我创建了一个新项目,比

我知道,如果我使用泛型方法或泛型类作为原始类型,而我的代码尚未编译,编译器会警告我不要将其作为原始类型使用

但是,如果我单独编译一个泛型代码,然后在我的新项目中使用这个编译过的类,那么编译器到底是如何警告我的呢 给定的类是泛型的,应该将其参数化。由于类型擦除,.class文件是纯泛型前代码,它不能知道它是否为泛型

为了更清楚地说明我的观点,如果在我的md.jar中有一个已编译的泛型类Employee,并且已经为它生成了一个预泛型类fileEmployee.class

现在,我创建了一个新项目,比如DevMon,并在我的构建路径中包含md.jar,编译器如何警告我Employee类是泛型的,即使它的类型已被完全删除

由于类型擦除,.class文件是纯泛型前代码,它不能知道它是否为泛型

不,那不是真的。类文件中仍然存在有关泛型类型的信息

类型擦除更多的是关于执行时间的知识。例如,在执行时,通过从新ArrayList生成的代码创建的对象不知道整数部分。ArrayList本身知道它是通用的

例如,此代码显示ArrayList和HashMap的类型参数:

由于类型擦除,.class文件是纯泛型前代码,它不能知道它是否为泛型

不,那不是真的。类文件中仍然存在有关泛型类型的信息

类型擦除更多的是关于执行时间的知识。例如,在执行时,通过从新ArrayList生成的代码创建的对象不知道整数部分。ArrayList本身知道它是通用的

例如,此代码显示ArrayList和HashMap的类型参数:


编译器(编译东西并专门检查它)和JVM(运行它)之间的区别是什么?也就是说,类型擦除只适用于运行时?编译器(编译东西并专门检查它)和JVM(运行它)之间的区别?例如,类型擦除仅在运行时适用?@AbhinavKumar:关于类本身的类型参数的信息是存在的-但是实例没有关于用于构造它的类型参数的任何信息。请参阅我的编辑,以获取显示HashMap和ArrayList类型参数的示例。感谢您的及时回复,我差点忘了感谢您:@AbhinavKumar:提供了有关类本身类型参数的信息-但是实例没有任何关于用于构造它的类型参数的信息。请参阅我的编辑以获取显示HashMap和ArrayList类型参数的示例。感谢您的及时回复,我差点忘了感谢您:
import java.util.*;
import java.lang.reflect.*;

public class Test {
    public static void main(String[] args) {
        showTypeParameters(ArrayList.class);
        showTypeParameters(HashMap.class);
    }

    private static void showTypeParameters(Class<?> clazz) {
        System.out.printf("%s:%n", clazz.getName());
        for (TypeVariable typeParameter : clazz.getTypeParameters()) {
            System.out.printf("  %s%n", typeParameter.getName());
        }
    }    
}