0

コードは次のとおりです。

import java.util.ArrayList;
import java.util.List;

public class Main {
    public abstract static class Base {
    }

    public static class Derived1 extends Base {
    }

    public static class Derived2 extends Base {
    }

    public static <T> T createObject(Class<T> someClass) {
        T a = null;
        try {
            a = someClass.newInstance();
        } catch (InstantiationException e) {
        } catch (IllegalAccessException e) {
        }
        return a;
    }

    public static void main(String[] args) {
        Derived2 d2 = createObject(Derived2.class);   // here it works

        // here is some array with classes
        Class[] someClasses = new Class[] { Derived1.class, Derived2.class };
        // here is some list which should be filled with objects of these classes
        List<? extends Base> l = new ArrayList();
        // in this loop, the list should be filled with objects
        for(Class c : someClasses) {
            l.add(createObject<? extends Base>(c));   // ERROR: java: illegal start of expression
        }
    }
}

上記のコードのエラーは次の行にあります。

l.add(createObject<? extends Base>(c));   // ERROR: java: illegal start of expression

リストが配列内のクラスのオブジェクトで満たされるように、forループを正しく構築する方法とメソッドを正しく呼び出す方法は?createObjectlsomeClasses

4

2 に答える 2

1

あなたClass[]は である必要がありClass<? extends Base>[]ます。List<Class<? extends Base>>または、ジェネリック警告を発生させない を使用します。

于 2013-03-04T17:59:25.017 に答える
0

配列ではできません。コンポーネントの型が具体化可能な型である配列のみを作成できます。これは、実行時に要素を配置するときに JVM が型チェックを行う必要があるためです (要素の型が配列の型と異なる場合は、ArrayStoreExceptionがスローされます)。Classつまり、 orの配列しか作成Class<?>できず、要素と の関係を表現できないためClass<Base>、配列から取得した項目に対して未チェックのキャストを実行する必要があります。

最初の修正は、配列を破棄し、ソースにジェネリック コンテナーを使用することです。List<Class<? extends Base>>

@SuppressWarnings("serial")
public static void main(String[] args) {

    List<Class<? extends Base>> src = new LinkedList<Class<? extends Base>>() {
        {
            add(Derived1.class);
            add(Derived2.class);
        }
    };

    List<Base> dst = new LinkedList<Base>();

    for (Class<? extends Base> c : src)
        dst.add(createObject(c));

}
于 2013-03-04T18:57:29.517 に答える