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