Java泛型类型的推断

时间:2012-07-17 09:13:25

标签: java generics

我有这样的类结构:

class A1,A2,..,An extends A;
class B1,B2,..,Bn extends B;

Ai转换为Bi的课程:

    private B1 convert(A1 a1){}
...
    private Bn convert(An an){}

如何使用<? extends B> convert(<? extends A> a)之类的签名定义单个公共方法? 现在我只有这种方法:

    B convert(A a){
      if(A.getClass().equals(A1.class)){
         return convert((A1)a);
      }...
    }

如果性能很重要并且频繁调用该方法,我可以使用instanceof吗?

2 个答案:

答案 0 :(得分:2)

一个更优雅的解决方案可能是在A中声明一个方法:[abstract,如果Aabstract}:

public abstract B toB();

重写类(A1,A2,...)必须覆盖它并实例化它们自己的B对象。

代码捕捉[使用static修饰符,因为我将其实现为内部类,不需要它,如果类是外部类则不能使用它们:

public abstract static class A { 
    public abstract B toB();
}
public static class A1 extends A {
    @Override
    public B1 toB() {
        return new B1();
    } 

}

public static class B {

}
public static class B1 extends B { 

}

答案 1 :(得分:0)

你可以做点什么:

public <AType extends A, BType extends B> BType convert(AType a) {...

但你可以有转换器界面,如:

public interface Converter<AType extends A, BType extends B> {

    AType convert(BType b);

    BType convert(AType a);

}

关于效果问题,您可以查看here