Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/316.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 如何使用与参数具有相同类的泛型创建构造函数_Java_Generics - Fatal编程技术网

Java 如何使用与参数具有相同类的泛型创建构造函数

Java 如何使用与参数具有相同类的泛型创建构造函数,java,generics,Java,Generics,我有一个类表达式: 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) { }

我有一个类表达式:

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) {
   }
}
公共类表达式
{
公共表达(E lV、操作、V rV){
}
公开表达(表达lE,操作操作,表达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);
}
publicstaticvoidmain(字符串[]args)
{
//第1行。
refactured.Expression<?,?>ex1=新的refactured.Expression(10d,OPERATION.PLUS,10f);
//第2行。
refactured.Expression<?,?>ex2=新的refactured.Expression(-3d,OPERATION.MUL,1f);
//第3行。
refactured.Expression<?,?>ex3=新重构的.Expression,重构的.Expression(ex1,OPERATION.减号,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>
线程“main”java.lang中出现异常。错误:未解决的编译问题: 构造函数表达式(表达式、操作、表达式)未定义 绑定不匹配:类型表达式不是类型表达式的绑定参数的有效替代品 绑定不匹配:类型表达式不是类型表达式的绑定参数的有效替代品
有什么问题吗?

表达式没有扩展number,因此它不是合法的类型参数

编辑-处理评论
我不确定您为什么需要此…
你可以吃类似的东西

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());
  }
}

重构。表达式<?,?>ex3=新的重构的.Expression< 双精度,浮点>(ex1,OPERATION.减号,ex2)


这应该是可行的。

从错误中可以明显看出,
表达式
不是数字的子类。如果确实希望在构造函数中接受表达式,则需要从泛型中删除上限绑定参数(数字)

像这样的东西应该适合你:

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) {}
}
公共类表达式{
公共表达式(E lV,OPERATION,V rV){}
公共表达式(表达式lE,运算操作,表达式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);
Expressionex1=新表达式(10d,OPERATION.PLUS,10f);
表达式ex2=新表达式(-3d,OPERATION.MUL,1f);
表达式<?,?>ex3=新表达式
,Expression(ex1,OPERATION.减号,ex2);

错误消息中有什么您不明白的?为什么第3行没有编译?您是否费心阅读错误消息?很清楚问题是什么…看起来很清楚,但问题是为什么?我在我的类中提供了2个构造函数,所以第二个构造函数应该适合第3行…no?
new Refactured.Expression,Refactured.Expression
Expression
不扩展
数字
类,因为它应该根据类声明进行扩展(
表达式
)。这就是它不起作用的原因。那么,我如何才能创建一个将表达式作为参数放入构造函数的表达式实例呢?这取决于您想要实现什么。如果您的所有原子表达式都具有相同的类型,您可以使用anubhava建议,否则您可能需要更复杂的类型层次结构。我需要创建e一个类表达式,可以计算一个简单的数学表达式,如:(a+b)或一个表达式,可以计算两个表达式,如:(b+c)*(a+b)。它在线程“main”java.lang中出现此异常。错误:未解决的编译问题:构造函数表达式(表达式、操作、表达式)在original.main.main中未定义(Main.java:17)`Use
Expressionex1
Expressionex2
,这是我在打开当前帖子之前做的(见我的原始问题)。我编辑了答案以帮助您,看看这是否适合您。我不知道如何才能看到您的原始问题。您的上一个命题和我的原始帖子之间的差异在哪里?无论如何,我已经尝试过了,但它没有编译。它给出了以下错误:线程“main”中出现异常错误:未解决的编译问题:在origing.Main.Main(Main.java:17)中未定义构造函数表达式(表达式、操作、表达式)