Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/314.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_Inheritance_Netbeans_Abstract Class - Fatal编程技术网

Java:无法使用泛型参数实现抽象方法

Java:无法使用泛型参数实现抽象方法,java,inheritance,netbeans,abstract-class,Java,Inheritance,Netbeans,Abstract Class,我有一个抽象类;其中一个抽象方法接受多态参数,如下所示: public abstract class MetricFunction<T extends MetricFunction> { public abstract double NDerv(int dervIndex, List<Double> evalPoint); } public class NumericMetricFunction extends MetricFunction { @

我有一个抽象类;其中一个抽象方法接受多态参数,如下所示:

public abstract class MetricFunction<T extends MetricFunction> {

    public abstract double NDerv(int dervIndex, List<Double> evalPoint);

}
public class NumericMetricFunction extends MetricFunction {

    @Override
    public double NDerv(int dervIndex, List<Double> evalPoint) {

        //Do something...
        double answer = 0.;

        return answer;
    }
}
    @Override
    public double NDerv(int dervIndex, List evalPoint) {

        //Do something...
        double answer = 0.;

        return answer;
    }
public class NumericMetricFunction extends MetricFunction<NumericMetricFunction> {...}
当我这样做的时候,一切似乎都正常。但是,我丢失了更具体的“evalPoint”类型,因为它现在只是一个通用列表

为什么会这样?我怎样做才能覆盖这个抽象方法,并且仍然确保“evalPoint”的类型是List?我不想打字,因为那是拙劣的练习;我看不出我最初的尝试有什么理由不起作用

更新:
我稍微修改了代码以正确地再现问题。

您的抽象类是泛型的,但您的实现类没有向其传递参数。如果像这样重做实现类,它将通过:

public class NumericMetricFunction extends MetricFunction<NumericMetricFunction> {

    @Override
    public double NDerv(int dervIndex, List<Double> evalPoint) {

        //Do something...
        double answer = 0.;

        return answer;
    }
}
公共类NumericMetricFunction扩展了MetricFunction{
@凌驾
公共双NDerv(内部数据索引,列表评估点){
//做点什么。。。
双重回答=0。;
返回答案;
}
}

将代码更改为使用泛型类型:

public abstract class MetricFunction<T extends Number> {

    public abstract double NDerv(int dervIndex, List<T> evalPoint);

}
公共抽象类MetricFunction{
公共摘要双NDerv(int-dervIndex,List-evalPoint);
}
使用它:

public class NumericMetricFunction extends MetricFunction<Double> {

    @Override
    public double NDerv(int dervIndex, List<Double> evalPoint) {

    }

}
公共类NumericMetricFunction扩展了MetricFunction{
@凌驾
公共双NDerv(内部数据索引,列表评估点){
}
}

我不知道为什么会这样,但我应该声明NumericMetricFunction如下:

public abstract class MetricFunction<T extends MetricFunction> {

    public abstract double NDerv(int dervIndex, List<Double> evalPoint);

}
public class NumericMetricFunction extends MetricFunction {

    @Override
    public double NDerv(int dervIndex, List<Double> evalPoint) {

        //Do something...
        double answer = 0.;

        return answer;
    }
}
    @Override
    public double NDerv(int dervIndex, List evalPoint) {

        //Do something...
        double answer = 0.;

        return answer;
    }
public class NumericMetricFunction extends MetricFunction<NumericMetricFunction> {...}
公共类NumericMetricFunction扩展了MetricFunction{…}

我认为这是一个IDE问题,因为我在Eclipse中也尝试过同样的问题

  • 日食:开普勒
  • JAVA:1.7
而且效果很好。自动生成的@Override具有列表

import java.util.List;

public abstract class MetricFunction {
    public abstract double NDerv(int dervIndex, List<Double> evalPoint);
}

import java.util.List;
import java.util.List;
公共抽象类度量函数{
公共摘要双NDerv(int-dervIndex,List-evalPoint);
}
导入java.util.List;
现在扩展它,自动添加覆盖功能

import java.util.List;

public class NumericMetricFunction extends MetricFunction {

    @Override
    public double NDerv(int dervIndex, List<Double> evalPoint) {
        // TODO Auto-generated method stub
        return 0;
    }

}
import java.util.List;
公共类NumericMetricFunction扩展了MetricFunction{
@凌驾
公共双NDerv(内部数据索引,列表评估点){
//TODO自动生成的方法存根
返回0;
}
}

看起来您找到了一个bug。实际上,让我们看看JLS在谈论你的问题(强调我的问题):

部分

在类C中声明或由类C继承的实例方法mC重写 从C中,另一个方法mA在类A中声明,iff以下所有内容 是真的:

A是C的一个超类

C不继承mA

mC的签名是其签名的子签名(§8.4.2) mA.

以下情况之一是正确的:

  • 马是公众人物
[……]

第一点很明显

第二点是正确的,因为您的类不会从超类继承方法,因为相同的擦除

第三点也是正确的,但需要注意。子签名的意思是()

方法m1的签名是方法m1的签名的子签名 方法m2,如果:

  • m2与m1具有相同的签名,或

  • m1的签名与m1的擦除(§4.6)相同 m2的签名。

同样,由于同样的擦除,这是真的

第四点也很明显

因此,您的代码应该编译得很好


Ideone
的编译器也不编译它

我能看到这个错误的唯一原因是,在MetricFunction或NumericMetricFunction中,在作用域中有另一个名为
Double
的类型(在其他实例中除外)。例如,您可能已经定义了自己的名为
Double
的成员类,或者您可能已经从
java.lang.Double
导入了另一个
Double
而不是普通的成员类;事实上,我正在使用一个名为“Real”的类,我刚刚确认它是从两个类文件中的同一个库中导入的。您显示的代码不会给出任何错误。一定还有别的问题。你可能有不同的
Real
类。没有理由它不起作用。你过度简化了示例。@Fakrudeen-好的,我会看看是否是这样。我不能这样做,因为我已经将MetricFunction编写为多态类。(我已经简化了这个问题的代码)。此外,这看起来更像是一个解决办法。它会让编译器闭嘴。。。但是坦率地说,他的示例代码没有问题,所以他需要给我们一个稍微复杂一点的示例。那么,为什么我能够在不传递这个参数的情况下实现其他方法呢?我现在知道了这个问题,但我不明白为什么我被允许继续以前的方式,直到我尝试实现这个特定的函数。那么为什么我在声明没有参数的类时没有遇到任何错误呢?编译器注册时没有将参数传递给泛型类作为警告,而不是错误。但是当涉及泛型(尤其是方法重载)时,它变得很重要,因为如果参数不同,相同的函数定义不会重载函数,即使擦除是相同的。实际上,这没什么区别。。。但是它会混淆编译器,因为类层次结构无法正确建立。正如我在回答类似的问题时所说的,我不能这样做,因为:1)它不能解决我的问题;这是一个变通办法。2) MetricFunction在我的实际代码中已经是多态类型了。我不这么认为。这里的超级类型是原始类型,因此方法mA具有擦除的签名。但这一点并不重要