奇怪的数组返回类型

时间:2013-01-07 20:11:57

标签: java arrays syntax declaration

有没有人看到数组[]放在方法签名之后呢?

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();
}

6 个答案:

答案 0 :(得分:89)

  

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

在这种情况下,它是为了与Java本身向后兼容。来自JLS section 8.4

  

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

是的,你应该把它视为一种令人厌恶的憎恶,除了震惊其他开发者之外没有任何好的目的。实际上,你可以用它来赢得派对上的一些钱,因为他们打赌它会编译,反对那些从未见过它的人......

这是正确的编码员期望无效的方法:

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

答案 1 :(得分:19)

就像

  String[] a; 

相同
  String a[];

同样适用于方法返回类型的语法

  public static String mySplit(String s)[] {

相同
  public static String[] mySplit(String s) {

但我认为我从未见过您在高效代码中提到的版本。

答案 2 :(得分:6)

我认为以下变量声明都是等价的原因相同

String[] array
String array[]

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

答案 3 :(得分:4)

我相信它只是告诉Java返回类型是Strings的数组,与声明

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

与声明变量类似:

String myStringArray[];

相当于

String[] myStringArray;

答案 4 :(得分:4)

好问题;当我实现一个Java解析器时,我记得此时对JLS语法感到非常困惑。

为了扩展约翰的回答,这是正在发生的事情:

至少有5个地方重要:

  • 方法类型签名
  • 局部变量声明
  • 字段声明
  • 形式参数
  • for - 环

这是语法的摘录,侧重于方法声明:

MethodOrFieldDecl:
    Type Identifier MethodOrFieldRest

MethodOrFieldRest:  
    FieldDeclaratorsRest ;
    MethodDeclaratorRest

MethodDeclaratorRest:
    FormalParameters {[]} [throws QualifiedIdentifierList] (Block | ;)

Type:
    BasicType {[]}
    ReferenceType  {[]}

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

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

答案 5 :(得分:2)

是的,这是允许的,

同样的原因:

String[] myArray;

相当于

String myArray[];