奇怪的数组返回types

有没有人看到这样的方法签名之后放置的数组[]

 public static String mySplit(String s)[] { return s.split(","); } public static void main(String... args) { String[] words = mySplit("a,b,c,d,e"); System.out.println(Arrays.toString(words)); } 

版画

 [a, b, c, d, e] 

在过去,奇数符号一直是“C”的兼容性,但我不会想象有人用C写这个。

有谁知道为什么这甚至允许?

我正在使用Java 7更新10,以防万一。

这在Java 6中也是这样。http://ideone.com/91rZV1


顺便说一句,这不编译,我也不会期望它

 public static <T> List mySplit(String s)<T> { return Collections.emptyList(); } 

有谁知道为什么这甚至允许?

在这种情况下,它是为了与Java本身的向后兼容性。 从JLS部分8.4 :

为了与旧版本的Java SE平台兼容,返回数组的方法的声明允许在forms参数列表之后放置构成数组types声明的空括号对(的一部分或全部)。 这是由以下过时的生产支持,但不应在新的代码中使用。

是的,除了打击其他开发商之外,你的确应该把它看作是没有好处的可憎的东西。 实际上,你也许可以用它来赢取一些钱,通过打赌它会编译,对付从未见过的人…

以下是这种正确的编码器预期无效的方法:

 public String[] mwahahaha(String[] evil[])[] { return evil; } 

就像是

  String[] a; 

是相同的

  String a[]; 

方法返回types的语法也是一样的

  public static String mySplit(String s)[] { 

是相同的

  public static String[] mySplit(String s) { 

但是我想我从来没有见过你在高效代码中提到的版本。

我认为它与下面的variables声明是相同的原因相同

 String[] array String array[] 

这是C开发人员所做的事情,所以它被包括来帮助他们。

我相信这只是告诉Java返回types是一个Strings数组,就像声明一样

 static String[] mySplit(String s) {... 

类似于声明variables:

 String myStringArray[]; 

相当于

 String[] myStringArray; 

好问题; 当我实现一个Javaparsing器时,我记得在这一点上被JLS语法困惑了。

为了扩大John的答案,下面是发生了什么事情:

  • 这在规范中被称为“混合符号”
  • 语法将types声明分成两部分,每部分可以有0个或更多个[]

有(至less)5个地方,这一点很重要:

  • 方法types签名
  • 局部variables声明
  • 现场声明
  • forms参数
  • for -loops

下面是语法的摘录,重点是方法声明:

 MethodOrFieldDecl: Type Identifier MethodOrFieldRest MethodOrFieldRest: FieldDeclaratorsRest ; MethodDeclaratorRest MethodDeclaratorRest: FormalParameters {[]} [throws QualifiedIdentifierList] (Block | ;) Type: BasicType {[]} ReferenceType {[]} 

(警告:阅读语法很困难,因为正方形和大括号有时是文字,有时是元字符。)

这表明[]可以出现在Type规则下,也可以作为MethodDeclaratorRest规则的一部分出现。 在两个地方都是可选的。

是的,这是允许的,

同样的原因:

 String[] myArray; 

相当于

 String myArray[];