我一直试图弄清楚如何使用泛型来检查超类的给定对象是否是该超类的子类的子类之一中的所需对象。让我举个例子吧:
假设我们有一个这样的层次结构:
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)
}
但不幸的是,这无法编译!我想使用泛型来检查
left
和right
是否是BooleanExpression
的实例,因为Conjunction
只能位于两个布尔值之间(而不是PositionExpression
)。但是,
left
和right
可以是不同的BooleanExpression
,left
可以是Conjunction
,而right
可以是BooleanTrue
(例如)。回顾一下:当给定参数
Conjunction
和left
都是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{}