使用自引用类型时java泛型方法中的绑定不匹配错误

使用自引用类型时java泛型方法中的绑定不匹配错误,java,generics,Java,Generics,在泛型方法中使用自引用类型,但在泛型类声明中不使用自引用类型时,会出现绑定不匹配错误;以下是错误代码的示例: 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 e

在泛型方法中使用自引用类型,但在泛型类声明中不使用自引用类型时,会出现绑定不匹配错误;以下是错误代码的示例:

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
}
请注意,由于该限制只存在于泛型方法中,而不存在于类中,因此我使用一个内部类来完成泛型方法的工作……还有其他解决方案吗


eclipse开发人员是否可以对这个限制说得更多?

这似乎是eclipse编译器的一个限制,或者更高级别的严格性
javac
很好地接受该代码

在Eclipse中,您可以编写:

public static class User<T> {}
public static class Box<T extends User<Box<T>>> {}
<T extends User<Box<?>>> void niceMethod(T user) {}
但是,它不允许您创建一个具体的
。例如:

Box<UserBox> b = new Box<>();
然后可以从
框的定义中删除自引用泛型:

static class Box<T, C extends BoxContext<?>> {
    void doSomething(T target, C context) {
        // do something
    }
}
static class Box>void processBox(Box){}

您的Java版本是什么?可能与@Fantagirocco重复对我来说,这似乎不是该问题的重复。我将通过编辑我的问题来进一步描述该问题。我还将说明我是如何绕过限制的。@stefanocasadei我添加了另一个替代解决方案。我注意到在
类定义中,类型
C
扩展了
BoxContext
;只是想知道,这不会降低变量
上下文的可用性吗?例如,方法
context.validate()
将不知道其参数的类型为
B
No,因为接口已经定义了验证方法必须采用Box或Box的子类。试试看!好的,我会尝试一下,然后在这里报告
public static void main(String[] args)
{
    Container c = new Container();

    c.niceMethod(new UserBox());
}
Box<UserBox> b = new Box<>();
interface BoxContext<B extends Box<?, ?>> {
    boolean validate(B box);
    void print(B box);
}
static class Box<T, C extends BoxContext<?>> {
    void doSomething(T target, C context) {
        // do something
    }
}
<T, C extends BoxContext<?>> void processBox(Box<T, C> box) {}