我遇到了一个问题,即将原始类型转换为由通配符参数化的类型会导致异常。强烈建议不要使用原始类型,但替代类型似乎也不需要。
请考虑以下类:
public static abstract class A<T> {
T t;
public abstract void add(T t2);
}
public static class C extends A<Double> {
@Override public void add(Double t2) { t += t2; }
}
public static class D extends A<String> {
@Override public void add(String t2) { t.concat(t2); }
}
和以下代码:
public static void main(String[] args) {
A<?>[] as = new A[2];
as[0] = new C();
as[1] = new D();
for (A<?> a: as)
a.add(a.t); // results in a type mismatch exception
for (A<?> a: as)
insideFor(a); // is not so neat
for (A a: as)
a.add(a.t); // makes use of raw types
}
private static <T> void insideFor(A<T> a) {
a.add(a.t);
}
我该怎么办?
第二种方式("不是那么整洁")是规范的方式。这称为捕获帮助程序。它利用捕获来引入"局部"类型变量。帮助程序方法通常private
,以便外部代码不必知道它的存在。
附言 S
不在任何地方使用