所以我有一個Tuple2
類,如下所示:類型推斷奇人異
public final class Tuple2<T1, T2> {
private final T1 mItem1;
private final T2 mItem2;
public T1 getItem1() { return mItem1; }
public T2 getItem2() { return mItem2; }
public Tuple2(final T1 pItem1, final T2 pItem2) {
mItem1 = pItem1;
mItem2 = pItem2;
}
public static <TItem1, TItem2> Tuple2<TItem1, TItem2>
Create(final TItem1 pItem1, final TItem2 pItem2) {
return new Tuple2<>(pItem1, pItem2);
}
}
,我試圖實例Tuple2
的List
S,但類型推斷似乎辦法不可思議。我希望我可以做這樣的事情:
// doesn't work
// note that Type2 extends Type1, and Type3 extends Type2
final List<Tuple2<String, Class<?>>> list = Arrays.asList(
Tuple2.Create("1", Type1.class),
Tuple2.Create("2", Type2.class),
Tuple2.Create("3", Type3.class)
);
// still doesn't work
final List<Tuple2<String, Class<? extends Type1>>> list = Arrays.asList(
Tuple2.Create("1", Type1.class),
Tuple2.Create("2", Type2.class),
Tuple2.Create("3", Type3.class)
);
無論這些工作,如果我投來Class<?>
或Class<? extends Type1>
無論是。
它所需要我做的卻是:
final List<Tuple2<String, ? extends Class<? extends Type1>>> list = Arrays.asList(
Tuple2.Create("1", Type1.class),
Tuple2.Create("2", Type2.class),
Tuple2.Create("3", Type3.class)
);
不過,如果我想定義這些Tuple2
S的一個參考我寫的:
final Tuple2<String, ? extends Class<? extends Type1>> item = list.get(0);
這是一個醜陋的類型名稱...有沒有一種方法來簡化這個?爲什麼它必須是Tuple2
「的東西,擴展Class
的東西,延伸Type1
」,而不是簡單地「Class
的東西」?
我發現的唯一的簡單的方法是使用Class
原始類型,這似乎是氣餒,需要一些鑄造:
final List<Tuple2<String, Class>> list = Arrays.asList(
Tuple2.Create("1", (Class)Type1.class),
Tuple2.Create("2", (Class)Type2.class),
Tuple2.Create("3", (Class)Type3.class)
);
final Tuple2<String, Class> item = list.get(0);
感謝,這不是那樣乾淨,我想它,但它是稍微好一點。 (儘管我使用靜態方法來獲得類型推斷,但是如果這是我能得到的最好的結果,我也可以在這種情況下使用構造函數)。爲什麼我無法將'TypeX.class'投到'Class >'? –
查看我的編輯:不幸的是,我並沒有很好的答案,爲什麼確實如此,但我給了我理解。 – Radiodef