【发布时间】:2014-03-18 23:29:05
【问题描述】:
所以我有一个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);
}
}
我正在尝试实例化 List 的 Tuple2s,但类型推断似乎很奇怪。我希望我能做这样的事情:
// 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)
);
但是,如果我想定义对这些Tuple2s 之一的引用,我必须写:
final Tuple2<String, ? extends Class<? extends Type1>> item = list.get(0);
这是一个丑陋的类型名称...有没有办法简化它?为什么它必须是一个Tuple2“扩展Class的东西”,而不是简单的“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);
【问题讨论】:
标签: java generics types casting type-inference