5

我有一些类似的东西:

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

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

但 IntelliJ 正在报告:

  1. 错误:(46, 18) java: > 预期
  2. 错误:(46, 19) java: 类型的非法开始
  3. 错误:(46, 26) java: '(' 预期
  4. 错误:(46, 28) java: <标识符> 预期
  5. 错误:(46, 29) java: 'l' 预期
  6. 错误:(46, 43) java: <标识符> 预期

有什么问题?我不允许将名称绑定到下限吗?还是我只允许R&X在上限中使用表达式?

将其更改为

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

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

产量

  1. 错误(46、31)java:> 预期
  2. 错误 (46, 32) java: '(' 预期
  3. 错误(46、33)java:类型的非法开始
4

1 回答 1

4

根据我对规范的阅读,super只能与通配符一起使用,不能捕获到类型变量中;见JLS 4.5.1。同样,&仅在类型变量中有效,在类型参数中无效,并且类型变量不能使用super

想了想,下面是我的解释:类型变量的原因是为了消除显式转换以提高类型安全性。当您将类型参数声明为 时super Foo,您是在说该参数可以是的任何超类Foo。这意味着它可以是任何内容,包括Object,因此您没有安全的方法来推测其类型满足该界限的对象的任何信息,因此命名类型变量中不包含任何信息;您只需将其通配符并可以调用hashCode()or toString(),但没有特定于类型的内容。

于 2013-08-10T00:14:19.093 回答