-2

以下代码在类型擦除后对运行时有何看法:

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();

}   
4

3 回答 3

1

以下代码不起作用:

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;
    }
}
于 2012-09-09T18:47:58.833 回答
0

假设你的Genrics班级实际上是你的Test班级,它应该相当于这样:

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();
}

无论我的假设是对还是错,考虑这一点的方法是,所有泛型类型参数都简单地从您的代码中删除,并替换为类型参数的最具体绑定(Object在您的情况下),或者在适当的情况下不替换。在需要的地方引入演员表。

Java 语言规范中详细说明了类型擦除的工作原理。

于 2012-09-09T18:42:12.233 回答
0

我认为它看起来像这样

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 类。

于 2012-09-09T18:42:43.153 回答