使用下限通配符(Java)的“意外令牌”

时间:2013-08-09 23:57:48

标签: java generics syntax-error bounded-wildcard

我有以下几点:

interface Foo<T> {
    //... lines [0,45]...

/*line 46*/ <R, X super T&R> List<X> weave(R value);
    //...
}

但是IntelliJ正在报道:

  1. 错误:(46,18)java:&gt;预期
  2. 错误:(46,19)java:非法启动类型
  3. 错误:(46,26)java:'('expect
  4. 错误:(46,28)java:&lt;标识符&gt;预期
  5. 错误:(46,29)java:'l'预期
  6. 错误:(46,43)java:&lt;标识符&gt;预期
  7. 有什么问题?我不允许将名字绑定到下限吗?或者我只允许在上限中使用R&X表达式?

    将其更改为

    interface Foo<T> {
        //... lines [0,45]...
    
    /*line 46*/ <R> List<? super T&R> weave(R value);
        //...
    }
    

    产量

    1. 错误(46,31)java:&gt;预期
    2. 错误(46,32)java:'('期望
    3. 错误(46,33)java:非法启动类型

1 个答案:

答案 0 :(得分:3)

通过阅读规范,super只能与通配符一起使用,不能被捕获到类型变量中;见JLS 4.5.1。同样,&仅在类型变量中有效,而不是类型参数,类型变量不能使用super

在考虑之后,我的解释如下:类型变量的原因是消除显式转换以提高类型安全性。当您将类型参数声明为super Foo时,您可以说该参数可以是 Foo的任何超类。这意味着它可以是包括Object在内的任何内容,因此您没有安全的方法来假设其类型满足该范围的对象的任何内容,因此没有任何包含在命名中的信息。类型变量;你只是通配了它,可以拨打hashCode()toString(),但没有特定类型。