如何从擦除转换泛型类型

我有一个父类,Parent有两个子类,A和B. 我有一个接口,Function<Type1 extends Parent,Type2 extends Parent>允许程序员编写一个特定的函数,Type2 of(Type1 t)将 Type1 转换为 Type2。该接口封装在一个类中,该类Wrapper<Type1 extends Parent,Type2 extends Parent>包含有用的信息,例如Class<Type1> type1Class等。


我的问题出现了,当我尝试实施add该方法的Wrapper类Wrapper<Type1,Type2> add(Wrapper<Type1,Type2> additionalWrapper)。我正在尝试将两个Functions 相加,但由于擦除,我很难得到 aType2而不是 a 输出Parent。


如何使add方法输出 aType2而不是 a Parent?


public class Parent {

    protected int value;

    public void setValue(int x){ value = x; }

    public int getValue(){ return value; }

    public Parent(){}

    public Parent(int x){setValue(x);}

    public Parent add(Parent p){return null;}

}



public class A extends Parent{

    public A(){ setValue(1); }

    public A(int x){ setValue(x); }

    public A(B b){ setValue( b.getValue()); }

    public A add(A a){ return new A( getValue()+a.getValue()); }

    public A add(B b){ return new A( getValue()*b.getValue()); }

}


public class B extends Parent{

    public B(){ setValue(2); }

    public B(int x){ setValue(x); }

    public B(A a){ setValue(a.getValue()); }

    public B add(B b){ return new B(getValue() + b.getValue()); }

    public B add(A a){ return new B(getValue() * a.getValue()); }

}


public interface Function <Type1 extends Parent, Type2 extends Parent> {

    public Type2 of(Type1 t);

}


public class Wrapper<Type1 extends Parent, Type2 extends Parent> {


    protected Function<Type1,Type2> function;

    protected Class<Type1> type1Class;

    protected Class<Type2> type2Class;

    public Wrapper(final Class<Type1> t1, final Class<Type2> t2, Function<Type1,Type2> x) {

        type1Class = t1;

        type2Class = t2;

        function = x;

    }


    public Type2 of(Type1 t){

        return function.of(t);

    }

  

catspeake
浏览 129回答 2
2回答

动漫人物

需要在单个覆盖函数中使用 instanceof Parent add(Parent p)。在 A 类和 B 类中,需要具有以下功能:@Overridepublic Parent add(Parent p){    if (p instanceof A){        A a = (A) p;        return add(a);    }    else if (p instanceof B){        B b = (B) p;        return add(b);    }    else return null;}

HUWWW

基本上你不用两种方法来添加 A 和 B,这违反了多态性或 SOLID 原则。您可以像下面这样构建您的课程 -class A extends Parent{public A(){ setValue(1); }public A(int x){ setValue(x); }public A(B b){ setValue( b.getValue()); }@Overridepublic A add(Parent a){ return new A( getValue()+a.getValue()); }}class B extends Parent{public B(){ setValue(2); }public B(int x){ setValue(x); }public B(A a){ setValue(a.getValue()); }@Overridepublic B add(Parent b){ return new B(getValue() + b.getValue()); }}因为add是在Parent中定义的,所以只有一种实现就足够了。在当前场景中,因为addin Class的签名A与签名 in 不匹配Parent,因此该方法根本没有被覆盖如果您添加@Override添加方法,您就会知道。编译器会抛出错误。希望这可以帮助。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java