我有一个如下界面:
public interface Functor<T> {
public <R> Functor<R> chain(Function<T, Functor<R>> f);
}
我希望实现:
public abstract class Either<T> implements Functor<T> {
private static class Right<T> extends Either<T> {
private T val;
private Right(final T val) {
this.val = val;
}
public <R> Either<R> chain (final Function<T, Either<R>> f) {
return f.apply(this.val);
}
}
}
原因是我希望能够&#34;链&#34;超过任何Functor<T>
但我希望这些仿函数要求与链返回的类型相同。
我能够让这个工作的唯一方法是:
public interface Functor<T> {
public <R> Functor<R> chain(Function<T, ? extends Functor<R>> f);
}
public abstract class Either<T> implements Functor<T> {
public static class Right<T> extends Either<T> {
private T val;
private Right(final T val) {
this.val = val;
}
public <R> Either<R> chain(final Function<T, ? extends Functor<R>> f) {
return (Either<R>)f.apply(this.val);
}
}
}
然而,这并不能完全表达我想要的......转换为(Either<R>)
的类型并不是解决此问题的最佳方式。
任何将? extends Either<R>
或Either<R>
放置的尝试都失败了&#34;右边不是抽象的,也不会覆盖抽象方法&lt; R&gt;链...&#34;
任何人都知道我能做些什么来解决这个问题? 有没有办法做到这一点?