Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ember.js/4.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 为什么使用F-Bounded类型在现有类型层次结构上添加新方法_Java_Generics_F Bounded Polymorphism - Fatal编程技术网

Java 为什么使用F-Bounded类型在现有类型层次结构上添加新方法

Java 为什么使用F-Bounded类型在现有类型层次结构上添加新方法,java,generics,f-bounded-polymorphism,Java,Generics,F Bounded Polymorphism,我正在阅读以下关于使用Java泛型解决表达式问题的文章 作者提出了第一种解决方案,使用F-有界类型来确保左参数和右参数的类型为EvalExp 我试图在不使用F-有界类型的情况下解决这个问题,最后得到了下面的代码,看起来很有效 public interface Exp { void print(); } public class Lit implements Exp { public int value; Lit(int value) { this.value = va

我正在阅读以下关于使用Java泛型解决表达式问题的文章

作者提出了第一种解决方案,使用F-有界类型来确保左参数和右参数的类型为EvalExp

我试图在不使用F-有界类型的情况下解决这个问题,最后得到了下面的代码,看起来很有效

public interface Exp {
    void print();
}

public class Lit implements Exp {
    public int value;
    Lit(int value) { this.value = value; }
    public void print() { System.out.print(value); }
}

public class Add<C extends Exp> implements Exp {
    public C left, right;

    public Add(final C left, final C right) {
        this.left = left;
        this.right = right;
    }

    @Override
    public void print() {
        left.print(); System.out.print("+"); right.print();
    }
}

public interface EvalExp extends Exp {
     int eval();
}

public class EvalLit extends Lit implements EvalExp {
    public EvalLit(int value) { super(value); }

    @Override
    public int eval() { return value; }
}

public class EvalAdd<A extends EvalExp> extends Add<A> implements EvalExp {

    public EvalAdd(A left, A right) {
        super(left, right);
    }

    @Override
    public int eval() {
        return left.eval() + right.eval();
    }
}
公共接口Exp{ 作废打印(); } 公共类{ 公共价值观; Lit(int值){this.value=value;} public void print(){System.out.print(值);} } 公共类Add实现Exp{ 公共C左,右; 公共添加(最后C左,最后C右){ this.left=左; 这个。右=右; } @凌驾 公开作废印刷品(){ left.print();System.out.print(“+”);right.print(); } } 公共接口EvalExp扩展{ int eval(); } 公共类EvalLit扩展了Lit实现EvalExp{ 公共EvalLit(int值){super(value);} @凌驾 public int eval(){返回值;} } 公共类EvalAdd扩展了Add实现EvalExp{ 公共评估(左、右){ 超级(左、右); } @凌驾 公共内部评估(){ 返回left.eval()+right.eval(); } } 此解决方案是否解决了表达式问题(是否可扩展用于新数据和操作)

是否满足代码级可扩展性(有关详细信息,请参阅论文)

与本文提出的F-有界解相比,上述解是否有任何缺点

欢迎任何解释


编辑:更新代码以修复编译问题

代码无法编译。它应该是
公共类Add implements Exp{
(而不是
C extends Eval
)吗?