我可以以某种方式部分实现单个类的一堆泛型吗?我想要实现的是,只有当somone真正依赖于那种类型时我才能接受通用。请参阅以下foo / bar示例,以了解我正在寻找的内容:
import java.util.Date;
public class Sample {
public static abstract class ASomeFunc<AK, AV, PK, PV> {
public void forwardTo(ASomeFunc<?, ?, PK, PV> lala) {
}
// EDIT 1:
// we do some logic here and then pass a map entry to an actual implementation
// but somethimes I do not care what the key is I am just interested in what the value is
// public abstract Map.Entry<PK, PV> compute(Map.Entry<AK, AV> data);
}
public static class SomeFunc2 extends ASomeFunc<Date, String, Number, Number> {
}
// what I would like to do:
// public static class SomeOtherFunc extends ASomeFunc<?, Number, ?, Number> {
// but I ony can:
public static class SomeOtherFunc extends ASomeFunc<Object, Number, Object, Number> {
}
public static void main(String[] args) {
// but this now clashes ... sinc object is explicitly defined
new SomeFunc2().forwardTo(new SomeOtherFunc());
}
}
答案 0 :(得分:1)
?
也不起作用,倒数第二个参数必须完全是Number
(因为泛型是不变的)。
你可以通过一些未经检查的演员表(一个丑陋的解决方案)绕过它。或者,如果PK
是消费者类型,请使用:
forwardTo(ASomeFunc<?, ?, ? super PK, PV> lala)
这也将使您的示例编译。 (另见PECS)
但是你的情况意味着你只是用你的子类实现ASomeFunc
的部分接口。
在这种情况下,您应该尝试拆分ASomeFunc
的接口,以便每个子类可以准确选择它们需要实现的内容,但仅此而已。