Java 泛型中的类型擦除

Java 泛型中的类型擦除,java,generics,type-erasure,Java,Generics,Type Erasure,在类型擦除之后,以下代码在运行时看什么: public class Test<T> { T lst; List<T> list1; void meth() throws InstantiationException, IllegalAccessException{ T res = (T)lst.getClass().newInstance();} static <S> void meth(S t){} } class TestUse{ public

在类型擦除之后,以下代码在运行时看什么:

public class Test<T> {

T lst;
List<T> list1;
void meth() throws InstantiationException, IllegalAccessException{  T res = (T)lst.getClass().newInstance();}

static <S> void meth(S t){}
}  
class TestUse{
public static void main(String[] args) {
Test<Integer> gint = new Test<Integer>();
Test<String> gstr = new Test<String>();
gint.meth();
gstr.meth();

}   
公共类测试{
T-lst;
清单1;
void meth()抛出实例化异常,IllegalAccessException{T res=(T)lst.getClass().newInstance();}
静态空位法(st){}
}  
类TestUse{
公共静态void main(字符串[]args){
测试gint=新测试();
测试gstr=新测试();
gint.meth();
gstr.meth();
}   

假设您的
Genrics
类实际上是您的
测试
类,它应该等价于以下内容:

public class Genrics {

    Object lst;
    List list1;
    void meth() throws InstantiationException, IllegalAccessException {
        Object res = lst.getClass().newInstance();
    }

    static void meth(Object t){}
}  
class TestUse{
    public static void main(String[] args) {
        Genrics gint = new Genrics();
        Genrics gstr = new Genrics();
        gint.meth();
        gstr.meth();
}
无论我的假设是对是错,考虑这一点的方法是,所有泛型类型参数都从代码中删除,并替换为类型参数的最特定的边界(
对象,在您的情况下是
),或者在适当的情况下不进行任何操作。必要时会引入强制转换


有关类型擦除工作原理的详细信息,请参见。

我想它看起来是这样的

public class Test {

    Object lst;
    List list1;
    void meth() throws InstantiationException, IllegalAccessException{  
        Object res =lst.getCla ss().newInstance();
    }

   static void meth(Object t){
   }
}

class TestUse{
    public static void main(String[] args) {
        Genrics gint = new Genrics();
        Genrics gstr = new Genrics();
        gint.meth();
        gstr.meth();
    }   

虽然我不认为这会按目前的情况编译。没有Genrics类,或者说是Test类。

下面的代码不起作用:

T res = (T)lst.getClass().newInstance();
因为在所有可能的情况下,T在运行时都是Object类型

一种解决方法是将泛型与继承一起使用:

public abstract class Generic<T> {

    public abstract Class<T> getConcreteClass();

    public void doSomething() {
        Class<T> clazz = getConcreteClass();
        T t = clazz.newInstance();
        doSomethingWithT();
    }
}

public class ConcreteClass extends Generic<YourObject> {
    public Class<YourObject> getConcreteClass() {
        return YourObject.class;
    }
}
公共抽象类泛型{
公共抽象类getConcreteClass();
公共无效剂量测定法(){
clazz类=getConcreteClass();
T=clazz.newInstance();
dosomethingWith();
}
}
公共类ConcreteClass扩展了泛型{
公共类getConcreteClass(){
返回object.class;
}
}

您尚未定义
Genrics
类。在类型擦除之后
Genrics gint=new Genrics();
将看起来像
Genrics gint=new Genrics();
。它在运行时看起来不像什么,因为它没有编译。
Test
类有一个无参数
meth()
instance方法。@user1649415:您尚未实例化lst;调用getClass()时,它应该抛出NullPointerException。