我遇到的问题是,将原始类型转换为通配符参数化的类型会导致异常。 原始类型非常沮丧,但替代品似乎也是不受欢迎的。
考虑以下课程:
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);
}
我该怎么办?
答案 0 :(得分:1)
第二种方式(&#34;不是那么整洁&#34;)是规范的方式。这称为捕获助手。它利用捕获能够引入一个&#34; local&#34;类型变量。辅助方法通常是private
,因此外部代码不必知道它。
P.S。 <{1}}未在任何地方使用