1

のインスタンスを取得することは可能Class<SomeGenericClass<SomeType>>ですか?

たとえば、のインスタンスをClass<ArrayList<String>>インスタンス化せずにのインスタンスArrayList<String>

 

@SuppressWarnings("unchecked")
public static <T> T castToGeneric(Object objectToCast, T typeInferrenceClass) {
    return (T)objectToCast;
}

// usage

Object someObject = null /* initialised elsewhere */;
List<String> listOfStrings = castToGeneric(someObject, new ArrayList<String>());

// I want to avoid having to create - new ArrayList<String>();

私はこのコードが醜いことを知っているので、これを行うべきではありません。しかし、私たちは私たちがいる場所です...

4

4 に答える 4

1

インスタンス化する場合Class<SomeGenericClass<SomeType>>

Class<List<Object>> list = (Class<List<Object>>)(Class<?>)List.class;

Type genericclass = new ArrayList<Object>() {}.getClass().getGenericSuperclass();
于 2012-05-16T09:55:14.940 に答える
1

私はあなたの問題に対するこの回避策を見つけました:

@SuppressWarnings("unchecked")
public static <T> T castToGeneric(Object objectToCast) {
    return (T)objectToCast;
}

// usage

Object someObject = null /* initialised elsewhere */;
Class<ArrayList<String>> listOfStrings = <Class<ArrayList<String>>>castToGeneric(someObject);

したがって、typeをパラメーターとして渡す代わりに、type-parameterとして渡します。

于 2012-05-16T10:11:25.370 に答える
0

Javaジェネリックの型消去は、「List <String>」のインスタンスで「getClass」を呼び出した結果、型引数「String」を失うため、言い換えると、「Class <List<String>>」を取得できない可能性があります。 。しかし、Scalaでそれを行うことができます:

scala> List("foo", "bar").getClass
res0: java.lang.Class[_ <: List[java.lang.String]] = class scala.collection.immutable.$colon$colon
于 2012-05-16T10:04:38.710 に答える
0

これは「インスタンスなし」の基準を満たし、コンパイルして正常に実行されます。

Class<ArrayList<String>> c =
    (Class<ArrayList<String>>) Class.forName("java.util.ArrayList");

これは型消去が原因で機能します。実行時ArrayList<String>は、だけArrayListで、さらにClass<ArrayList<String>>はだけClassです。

于 2012-05-16T18:46:53.913 に答える