-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

The following piece of code would not work:

T res = (T)lst.getClass().newInstance();

Since T is of type Object at runtime in all the possible cases.

One workaround is using generics with inheritance:

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 に答える