我想重写子类中的通用功能,如下所示:为什么泛型参数“扩展”派生函数中不允许的东西,但泛型返回类型是?
超类:
public abstract class Metric {
public abstract <T extends Foo> T precompute(); // valid syntax
public abstract <T extends Foo> void distance(T arg); // valid syntax
public static class Foo {}
}
子类:
public class MetricDefault extends Metric {
@Override
public Bar precompute() { return new Bar(); } // Valid - return type extends Foo
@Override
public void distance(Bar arg) {} // Invalid ??? - argument type extends foo
public static class Bar extends Metric.Foo {}
}
通用功能,当泛型类型是返回函数的值,是有效的Java代码并成功构建。
仅更改泛型类型的位置 - 使其成为函数的参数,而不是返回类型 - 并且它变成无效的Java代码。
为什么后者无效?我能做些什么来实现这个功能?
下面有很好的解决方案,但我想补充一点,你的OP的问题是你通过指定一个子类型'Foo'来重载**方法'distance'。 NetBeans抱怨'@ Override'不应该在那里,因为'distance'不会覆盖超类中的任何方法。 – toto2 2011-06-07 01:58:28