我一直试图弄清楚如何使用泛型来检查超类的给定对象是否是该超类的子类的子类之一中的所需对象。让我举个例子吧:

假设我们有一个这样的层次结构:

public interface Expression{
    public Object evaluate();
}

public abstract class BooleanExpression implements Expression{
    public abstract Boolean evaluate();
}

public abstract class PositionExpression implements Expression{
    public abstract Integer[] evaluate();
}

public class Conjunction extends BooleanExpression{
    public Boolean evaluate()
}

public class BooleanTrue extends BooleanExpression{
    @Override
    public Boolean evaluate(){
         return true;
    }
 }


现在,我的观点是,仅当且仅当构造函数中的给定参数为BooleanExpression或此类的子类时,程序才应能够从Conjunction构造对象。

我试过使用这样的泛型:

public class Conjunction<T extends BooleanExpression> extends BooleanExpression{
   public Conjuction(T left, T right){
        this.left = left;
        this.right = right;
   }

   private T left, right;

   @Override
   public Boolean evaluate(){
       return (left.evaluate() && right.evaluate())
   }


当我想创建一个实例时,我有以下代码:

public Expression createConjunction(Expression left, Expression right){
     return new Conjunction<BooleanExpression>(left, right)
}


但不幸的是,这无法编译!我想使用泛型来检查leftright是否是BooleanExpression的实例,因为Conjunction只能位于两个布尔值之间(而不是PositionExpression)。
但是,leftright可以是不同的BooleanExpressionleft可以是Conjunction,而right可以是BooleanTrue(例如)。

回顾一下:当给定参数Conjunctionleft都是BooleanExpression的子类时,我希望能够创建right的实例。
使用参数之一作为Conjuction的子类创建PositionExpression的实例不应被编译器接受。

我想解决此问题而无需更改createConjunction方法并使用通用类/接口。有任何想法吗?

最佳答案

public Expression createConjunction(Expression left, Expression right){
     return new Conjunction<BooleanExpression>(left, right)
}


在上述方法中,您要请求2个expression对象,但在
conjuction构造函数正在请求2个对象,这些对象扩展了Booleanexpressions这是您遇到编译错误的部分。

您可以将createConjuction方法更改为

 public Expression createConjunction(BooleanExpression left, BooleanExpression right){
         return new Conjunction<BooleanExpression>(left, right)
    }


或者您可以将generic类中的conjuction表达式更改为

 Conjunction<T extends Expression> extends BooleanExpression{}

07-24 19:02