【发布时间】:2019-03-13 11:00:00
【问题描述】:
在泛型方法中使用自引用类型时出现绑定不匹配错误,但在泛型类声明中没有;这是错误代码的示例:
public class Container {
public static class User<X> {} // line 1
public static class Box<U extends User<Box<U>>> {} // line 2
public static class NiceBox<U extends User<Box<U>>> {} // line 3: OK
<U extends User<Box<U>>> void niceMethod(U user) {} // line 4: NOT OK
}
第 4 行的编译错误消息:绑定不匹配:
U类型不是 有效替代Container.Box<U>类型的有界参数< U extends Container.User<Container.Box<U>>>
我不明白为什么,在此先感谢您的帮助, SC
PS:请注意,与之前提出的问题不同,这里提出的问题仅存在于泛型方法中,编译器在泛型类声明中使用时接受有问题的类型绑定。
我正在使用最新 Eclipse 发行版随附的 Java 11 编译器。
这里有更多关于我想要实现的目标的详细信息。 我正在构建一个 Box,它需要在 C 类型的上下文中对 T 类型的目标执行一些工作,其中该上下文 C 必须满足最小接口。 然后我需要定义处理 Box 的方法(因此需要一个具有自引用类型绑定的泛型方法)。 代码如下:
static class Box<T,C extends MinimalContext<Box<T,C>>> {
void doSomething(T target, C context) {
// do something
}
}
interface MinimalContext<B> {
boolean validate(B box);
void print(B box);
}
// FAILS:
<T,C extends MinimalContext<Box<T,C>>>
void processBox(Box<T,C> box) {}
// Instead use:
class BoxProcessor<T,C extends MinimalContext<Box<T,C>>>
{
BoxProcessor(Box<T,C> box) {
// use box as niceMethod would do
}
}
请注意,由于限制只存在于泛型方法而不是类,我使用内部类来完成泛型方法的工作......还有其他解决方案吗?
eclipse 开发人员能否详细说明此限制?
【问题讨论】:
-
你的 Java 版本是多少?
-
@fantaghirocco 对我来说,这似乎不是那个问题的重复。