【问题标题】:"Unexpected token" using lower-bounded wildcard (Java)使用下界通配符 (Java) 的“意外令牌”
【发布时间】:2013-08-12 00:18:50
【问题描述】:

我有一些类似的东西:

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&amp;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. Error(46, 33) java: 类型的非法开始

【问题讨论】:

标签: java generics syntax-error bounded-wildcard


【解决方案1】:

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

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

【讨论】:

  • 你能想出任何方法来指定我正在尝试的语义吗?
  • 你能解释一下语义吗? O:-) 从您的代码中推断并不容易。 interface Foo 应该做什么? weave 呢?在返回类型中使用 super 的目的是什么?
  • Foo 只是 T 的集合。“weave”是通常用于打印数组元素的模式的概括:[1, 2, 3].weave(",")将返回 [1, ",", 2, ",", 3,]。换句话说,它返回this,除了每个元素之间拼接的参数。至于泛型的语义,我想返回一个 R 和 T 共有的最衍生超类型的列表,尽管我不确定这种机制是否存在。我想这样做,以便尽可能以某种方式(而不仅仅是原始列表)对返回的列表进行参数化,以确保类型安全。
  • 我将不得不咀嚼这个,但仍然可能无法给你答案,但你正在寻找的可能是这样的:&lt;S, T extends S, R extends S&gt; List&lt;S&gt; weave(R value)。我现在没有游戏项目;编译器对此有何看法?
  • 这行得通,但我必须将其设为静态方法,否则 T extends S 将不得不在类本身上运行。
猜你喜欢
  • 1970-01-01
  • 2019-11-01
  • 1970-01-01
  • 2017-02-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-27
相关资源
最近更新 更多