如何从擦除类型转换类型

时间:2018-10-06 04:06:57

标签: java generics types casting erasure

我有一个父类from darren.py import compute_mean 和两个子类ParentA。我有一个接口B,该接口允许程序员编写将Type1转换为Type2的特定功能Function<Type1 extends Parent,Type2 extends Parent>。该界面包装在类Type2 of(Type1 t)中,该类包含有用的信息,例如Wrapper<Type1 extends Parent,Type2 extends Parent>等。

当我尝试为Class<Type1> type1Classadd实现Wrapper方法时,就会出现我的问题。我正在尝试将两个Wrapper<Type1,Type2> add(Wrapper<Type1,Type2> additionalWrapper)加在一起,但是由于擦除,我很难输出Function而不是Type2

如何使Parent方法输出的是add而不是Type2

Parent

2 个答案:

答案 0 :(得分:1)

正如Louis Wasserman在评论中建议的那样,我需要在单个重写函数Parent add(Parent p)中使用instanceof。

在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;
}

答案 1 :(得分:0)

基本上,您没有两种添加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中定义的,因此仅一种实现就足够了。在当前情况下,由于类addA的签名与Parent中的签名不匹配,因此方法根本不会被覆盖 < / p>

您将知道是否在添加方法上添加@Override。编译器将引发错误。

希望这会有所帮助。