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。