通配符类型不匹配与原始类型不匹配



我遇到了一个问题,即将原始类型转换为由通配符参数化的类型会导致异常。强烈建议不要使用原始类型,但替代类型似乎也不需要。

请考虑以下类:

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不在任何地方使用

最新更新