作者热门文章
- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我想重写子类中的泛型函数,如下:
父类(super class):
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 代码。
为什么后一种情况无效?我该怎么做才能实现此功能?
最佳答案
方法声明
public abstract <T extends Foo> void distance(T arg);
表示该方法接受一个T
参数,调用者可以决定使用Foo
的哪个子类型作为T
。
方法声明
public abstract <T extends Foo> T precompute();
表示该方法返回一些T
类型的对象,调用者可以决定使用Foo
的哪个子类型作为T
。
最后一个方法不能真正实现(除了返回 null
),因为你的方法并不知道在这里生成什么对象。
在您的具体类中,您尝试覆盖这些方法 - 据我了解,您不应该被允许同时使用它们,但也许编译器比我更宽松一些。
我认为您真正想要的是 Overbose 发布的内容。
关于java - 为什么泛型参数 "extends"在派生函数中不允许,但泛型返回类型是?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6259708/
我是一名优秀的程序员,十分优秀!