我可以以某种方式部分实现单个类的一堆泛型

时间:2016-09-29 10:04:29

标签: java generics

我可以以某种方式部分实现单个类的一堆泛型吗?我想要实现的是,只有当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());
    }
}

1 个答案:

答案 0 :(得分:1)

?也不起作用,倒数第二个参数必须完全是Number(因为泛型是不变的)。

你可以通过一些未经检查的演员表(一个丑陋的解决方案)绕过它。或者,如果PK是消费者类型,请使用:

forwardTo(ASomeFunc<?, ?, ? super PK, PV> lala)

这也将使您的示例编译。 (另见PECS

但是你的情况意味着你只是用你的子类实现ASomeFunc的部分接口。

在这种情况下,您应该尝试拆分ASomeFunc的接口,以便每个子类可以准确选择它们需要实现的内容,但仅此而已。