Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/339.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/backbone.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java泛型类型';推断_Java_Generics - Fatal编程技术网

Java泛型类型';推断

Java泛型类型';推断,java,generics,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){} 如何定义带有签名的单个公共方法,如,您可以执行以下操作: public <AType extends A, BType extends B> BType convert(AType a

我的班级结构如下:

class A1,A2,..,An extends A;
class B1,B2,..,Bn extends B;
以及将
Ai
转换为
Bi
的类:

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

如何定义带有签名的单个公共方法,如
,您可以执行以下操作:

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

public

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

public abstract B toB();
重写类(A1,A2,…)必须重写它并实例化它们自己的
B
对象

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

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 { 

}

只是一个想法:我认为一个更优雅的解决方案是在
a
中声明一个方法[最好是抽象的,如果
a
是抽象的]:
public B toB()
,它将从调用方创建一个
B
实例。非常简单!非常感谢。为什么我没有考虑它?因为它似乎对你有帮助,我添加了一个代码快照作为答案。很高兴我能帮忙。
public abstract B toB();
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 { 

}