首页 > 解决方案 > 覆盖 Java 方法时使用子类型参数

问题描述

我正在考虑Monoid用 Java 编写一个“类型类”。例如,

interface Monoid<A> {
  Monoid<A> mappend(Monoid<A> ma);
}

但是,如果您希望自己List成为Monoid. 你不能to override。问题是参数应该是逆变的。一种残酷的强制方式是声明如下:mappendList<A> mapppend(List<A> la);mappend

Function<? extends Monoid<A>, ? extends Monoid<A>> mappend();

经过一段时间的实验,我想到了以下几点:

interface X<A, Y extends X<?,?>> {
    Y f(Y y);
}

interface Z<A> extends X<A,Z<A>> {
    @Override Z<A> f(Z<A> za);
}

但这不是一个通用的解决方案(对于可能ApplicativeMonad):

interface X<A, Y extends X<?,?>> {
    Y f(Y y);
    <B> Y g(Function<A,Y> ay);
}

interface Z<A> extends X<A,Z<?>> {
    @Override Z<A> f(Z<?> za);
    @Override <B> Z<B> g(Function<A, Z<?>> ay);
}

@Override <B> Z<B> g(Function<A, Z<?>> ay);是我能做的最好的bind

有没有办法得到一个@Override <B> Z<B> g(Function<A, Z<B>> ay);

标签: javatype-inference

解决方案


推荐阅读