从类型化中使用的泛型类型访问类型参数

mis*_*ner 5 java generics

我发现了泛型的以下问题.考虑通用接口

public interface A<X> {
    X get();
    void doStuff(X x);
}
Run Code Online (Sandbox Code Playgroud)

现在,让我们假设以下方法定义:

public <T extends A<?>> void foo(T t) {
    bar(t);
}
Run Code Online (Sandbox Code Playgroud)

由于通配符,get()的返回类型的类型信息不足.因此,我必须委托另一个方法将这个通配符"绑定"到一个新的类型变量:

private <X> void bar(A<X> t) {
    X x = t.get();
    t.doStuff(x);
}
Run Code Online (Sandbox Code Playgroud)

不允许在foo中调用bar(),编译器输出以下错误消息:

类型测试中的方法栏(A)不适用于参数(T)

但是,如果我将方法foo()更改为

public <T extends A<?>> void foo(T t) {
    A<?> u = t; // No explicit cast required, no "unchecked" warning!
    bar(u);
}
Run Code Online (Sandbox Code Playgroud)

有用.为什么?这是编译错误吗?对此有任何意见将非常感谢.

笔记:

  • 我不简单地将方法foo声明为void foo(A)的原因是我实际上使用的是上层类型绑定的intersection(&).
  • 我没有在Xoo()中将X声明为类型变量的原因是我实际上在类级别有问题,并且不希望不必要地增加此类的类型参数的数量.

kan*_*kan 2

我检查了代码:

public class Test
{
    public interface A<X> {
        X get();
        void doStuff(X x);
    }
    public <T extends A<?>> void foo(T t) {
        bar(t);
    }

    private <X> void bar(A<X> t) {
        X x = t.get();
        t.doStuff(x);
    }
}
Run Code Online (Sandbox Code Playgroud)

有用。javac 1.6.0_22。你哪里有错误?或者我使用另一个代码?