2012-07-17 127 views
0

我的阶级结构是这样的:Java的泛型类型的推断

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

而且类转换成AiBi

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如果性能比较是重要的,该方法将被频繁调用?

+3

只是一个想法:IMHO更优雅的解决方案将是在'A'中声明一个方法[最好是抽象的,如果'A'是抽象的]:'public B toB()',这将从调用者创建一个'B'实例。 – amit 2012-07-17 09:21:01

+0

就这么简单!谢谢!为什么我没有想到它? – 2012-07-17 09:36:13

+0

由于它似乎可以帮助您,因此我将其添加为代码捕捉的答案。很高兴我能帮上忙。 – amit 2012-07-17 09:42:01

回答

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 { 

} 
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

+0

谢谢你,弗朗西斯科! – 2012-07-17 09:35:00