我被困在試圖弄清楚如何使用泛型來檢查超類的給定對象是否是來自此超類的子類之一的子類的期望對象。讓我舉一個例子:泛型和類型安全:檢查參數的動態綁定
比方說,我們有一個層次結構:
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或此類的一個子類。
我曾嘗試使用泛型這樣的:
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
和right
都是BooleanExpression的子類時。 創建一個Conjuction
的實例,其中一個參數是PositionExpression
的子類不應被編譯器接受。
我想在不改變createConjunction
方法和使用泛型類/接口的情況下解決此問題。有任何想法嗎?
你一定要改變'createConjunction'函數,因爲在它的當前形式下它是無效的。所有你應該改變的是使'左'和'右'布爾表達式'而不是'表達式'的類型。 – luk2302
編譯器正在做它應該做的事情。它不會編譯,因爲'left'和'right'是'Expression's,但是'Conjuction'構造函數明確要求它們是'BooleanExpression'的子類。 – Casey
@Casey我猜編譯器沒有辦法檢查'left'的底層對象是否是子類'BooleanExpression',是嗎? (例如,當我調用這個方法'createConjunction'時,'left'參數可以包含'BooleanTrue',它是'BooleanExpression'的子類(它實現'Expression'接口)) –