【发布时间】:2018-04-27 05:54:02
【问题描述】:
我想定义一个使用具有多个边界的类型的函数,其中一个边界是另一个类型参数。例如:
<A, R extends A & SomeInterface> R doSomething(...);
似乎(根据 Intellij IDEA)这是不允许的,任何具有多个边界的类型也不允许,其中任何一个边界都是类型参数。 所以这些都是非法的:
<A, R extends A & SomeInterface> R doSomething(...);
<A, B, R extends A & B> R doSomething(...);
但这些是合法的:
<R extends SomeType & SomeInterface> R doSomething(...);
<A, R extends A> R doSomething(...);
禁止扩展类型参数和接口的情况,但允许将类型参数替换为文字类型(类、枚举或接口)。如果根本不允许将类型参数作为边界,我会理解,但事实并非如此。我有什么遗漏吗?
如果这是一个 xy 问题,我要解决的确切问题是:
public interface Functor<A, Self extends Functor<?, Self>>
{
<B, SelfB extends Self & Functor<B, Self>> SelfB map(Function<A, B> f);
}
上述声明,如果它是合法的,似乎提供了足够的约束来解决this problem;确保返回类型是相同类型的函子,以 B 作为其数据参数。 这是扩展接口和由类型参数确定的其他类型的情况。
【问题讨论】: