[英]How can i create a constructor with generics with same class as argument
我有一個類Expression:
public class Expression < E extends Number, V extends Number >
{
public Expression(E lV, OPERATION operation, V rV) {
}
public Expression(Expression< E, V > lE, OPERATION operation, Expression< E, V > rE) {
}
}
Expression.java編譯沒有錯誤。
這是我的主要課程代碼。
public static void main(String[] args)
{
// Line 1.
refactored.Expression< ?, ? > ex1 = new refactored.Expression< Double, Float >(10d, OPERATION.PLUS, 10f);
// Line 2.
refactored.Expression< ?, ? > ex2 = new refactored.Expression< Double, Float >(-3d, OPERATION.MUL, 1f);
// Line 3.
refactored.Expression< ?, ? > ex3 = new refactored.Expression< refactored.Expression< Double, Float >, refactored.Expression< Double, Float > >(ex1, OPERATION.MINUS, ex2);
}
3號線無法編譯,它說:
Exception in thread "main" java.lang.Error: Unresolved compilation problems:
The constructor Expression<Expression<Double,Float>,Expression<Double,Float>>(Expression<capture#1-of ?,capture#2-of ?>, OPERATION, Expression<capture#3-of ?,capture#4-of ?>) is undefined
Bound mismatch: The type Expression<Double,Float> is not a valid substitute for the bounded parameter <E extends Number> of the type Expression<E,V>
Bound mismatch: The type Expression<Double,Float> is not a valid substitute for the bounded parameter <V extends Number> of the type Expression<E,V>
它出什么問題了?
表達式不擴展數字,因此不是合法的類型參數。
編輯-解決評論
我不確定為什么您需要通用的解決方案...
你可以有類似的東西
interface Expression {
Number compute();
}
class AtomicExpression implements Expression {
private final Number number;
AtomicExpression(Number number) {
this.number = number;
}
public Number compute() {
return number;
}
}
class BinaryExpression implements Expression {
private final Expression expr1;
private final Expression expr2;
private final Operator op;
AtomicExpression(Expression expr1, Expression expr1. Operator op) {
this.expr1 = expr1;
this.expr2 = expr2;
this.op = op;
}
public Number compute() {
return op(expr1.compute(), expr2.compute());
}
}
重構.Expression <?,? > ex3 =新重構的.Expression <Double,Float>(ex1,OPERATION.MINUS,ex2);
這應該工作。
從錯誤中可以明顯看出, Expression<?, ?>
不是Number的子類。 如果您確實想在構造函數中接受Expression,則需要從泛型中刪除上限的綁定參數 (數字)。
這樣的事情應該為您工作:
public class Expression <E, V> {
public Expression(E lV, OPERATION operation, V rV) {}
public Expression(Expression< E, V > lE, OPERATION operation, Expression< E, V > rE) {}
}
更新:這應該工作然后:
Expression< Double, Float > ex1 = new Expression< Double, Float >(10d, OPERATION.PLUS, 10f);
Expression< Double, Float > ex2 = new Expression< Double, Float >(-3d, OPERATION.MUL, 1f);
Expression< ?, ? > ex3 = new Expression
< Expression< Double, Float >, Expression< Double, Float > >(ex1, OPERATION.MINUS, ex2);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.