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

时间:2013-12-22 18:53:12

标签: java generics wildcard raw-types

我遇到的问题是,将原始类型转换为通配符参数化的类型会导致异常。 原始类型非常沮丧,但替代品似乎也是不受欢迎的。

考虑以下课程:

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);
}

我该怎么办?

1 个答案:

答案 0 :(得分:1)

第二种方式(&#34;不是那么整洁&#34;)是规范的方式。这称为捕获助手。它利用捕获能够引入一个&#34; local&#34;类型变量。辅助方法通常是private,因此外部代码不必知道它。

P.S。 <{1}}未在任何地方使用