为了账号安全,请及时绑定邮箱和手机立即绑定

如何从擦除转换泛型类型

如何从擦除转换泛型类型

catspeake 2021-10-28 17:07:04
我有一个父类,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);    }  
查看完整描述

2 回答

?
动漫人物

TA贡献1815条经验 获得超10个赞

需要在单个覆盖函数中使用 instanceof Parent add(Parent p)。


在 A 类和 B 类中,需要具有以下功能:


@Override

public 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;

}


查看完整回答
反对 回复 2021-10-28
?
HUWWW

TA贡献1874条经验 获得超12个赞

基本上你不用两种方法来添加 A 和 B,这违反了多态性或 SOLID 原则。您可以像下面这样构建您的课程 -


class A extends Parent{

public A(){ setValue(1); }

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

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

@Override

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

@Override

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

}

因为add是在Parent中定义的,所以只有一种实现就足够了。在当前场景中,因为addin Class的签名A与签名 in 不匹配Parent,因此该方法根本没有被覆盖


如果您添加@Override添加方法,您就会知道。编译器会抛出错误。


希望这可以帮助。


查看完整回答
反对 回复 2021-10-28
  • 2 回答
  • 0 关注
  • 128 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信