【问题标题】:Generics error syntax Java 1.7 on generics function泛型函数上的泛型错误语法 Java 1.7
【发布时间】:2015-08-11 11:36:18
【问题描述】:

使用 Java 1.7 编译器,有趣的是,调用泛型函数所接受的语法非常特殊。它强制你使用this 来引用泛型函数。

例如对于定义为的函数:

private <T> Object genericFunction(T t){
    //function code
}

引用它时,下面给出了一个语法错误:

Object o = <ClassName>genericFunction(ClassName t);

虽然接受以下内容:

Object o = this.<ClassName>genericFunction(ClassName t);

为什么会这样?不应该两个都用吗?

【问题讨论】:

  • 可能是因为它更难解析,因为它看起来像一个比较。
  • 你为什么要提供类型见证?
  • 是的,这很烦人。一定有一些技术上的困难。并且好处可能不是很大,因为在大多数情况下,类型会被推断出来。
  • 为什么说它是必需的?我可以使用 1.7 编译器调用通用函数,如下所示: Object o = genericFunction(s) 其中 s 是一个字符串,而 genericFunction 的定义与您在示例中所做的一样。
  • 但是如果你在函数调用中使用泛型见证,它不会让你把它放在它前面,除非你有一个表达式后跟一个.

标签: java generics compiler-errors syntax-error


【解决方案1】:

Java Language Specification 需要它。

方法调用:

  • 方法名([ArgumentList])
  • 类型名称。 [TypeArguments] 标识符 ([ArgumentList] )
  • 表达式名称。 [TypeArguments] 标识符 ([ArgumentList] )
  • 主要。 [TypeArguments] 标识符 ([ArgumentList] )
  • 超级。 [TypeArguments] 标识符 ([ArgumentList] )
  • 类型名称。极好的 。 [TypeArguments] 标识符 ([ArgumentList] )

TypeArguments 元素总是必须出现在某个表达式之后,然后是 .。它不能放在简单的方法名之前。

【讨论】:

  • 如果不需要它不是很好吗?
  • @JadieldeArmas 这并不困扰我。无论如何,您很少需要提供它(至少从 Java 8 开始)。
  • @JadieldeArmas 为什么需要&lt;ClassName&gt;根本?应该是从参数中推断出来的。
  • @chrylis:你说得对,在我的例子中不需要见证人。
  • @JadieldeArmas C# 是你最好的选择。
猜你喜欢
  • 2012-08-29
  • 1970-01-01
  • 1970-01-01
  • 2010-09-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-19
  • 2021-02-21
相关资源
最近更新 更多