奇怪的数组返回类型

有没有人见过像这样放在方法签名后面的数组 []

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 写这个。

有人知道为什么这是允许的吗?

我使用的是 Java7更新10,以防万一。

这在 Java6.http://ideone.com/91rZV1中做同样的事情


顺便说一下,这个不能编译,我也不希望它能编译

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

有人知道为什么这是允许的吗?

在这种情况下,它的向下兼容是 Java 本身:

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

是的,您确实应该将其视为一种令人憎恶的东西,除了震惊其他开发人员之外没有其他好的目的。事实上,你也许可以用它在派对上赢一些钱通过打赌它会编译,对付那些从未见过它的人..。

下面这种方法正常的程序员会认为是无效的:

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

我认为这和下面的变量声明是等价的原因是一样的

String[] array
String array[]

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

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

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

类似于声明变量:

String myStringArray[];

相当于

String[] myStringArray;

就好像

  String[] a;

  String a[];

方法返回类型的语法也是如此

  public static String mySplit(String s)[] {

  public static String[] mySplit(String s) {

但是我想我还没有看到您在高效代码中提到的版本。

是的,这是允许的,

同样的原因:

String[] myArray;

相当于

String myArray[];

问得好; 当我实现 Java 解析器时,我记得在这一点上对 JLS 语法感到非常困惑。

为了进一步阐述约翰的回答,以下是事情的经过:

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

至少有5个地方需要这样做:

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

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

MethodOrFieldDecl:
Type Identifier MethodOrFieldRest


MethodOrFieldRest:
FieldDeclaratorsRest ;
MethodDeclaratorRest


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


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

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

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