怪阵返回类型(Strange array return type)

2019-07-17 22:46发布

已任一项看到的阵列[]置于这样的方法签名后?

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

Answer 1:

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

在这种情况下,它是用Java本身的向后兼容性。 从JLS节8.4 :

为了与旧版本的Java SE平台的相容性,它返回一个阵列的方法的声明被允许放置(一些或全部),其形成所述形参列表后的数组类型的声明中的空的托架对。 这是由以下的落后生产支持,但不应该在新的代码中使用。

是的,你确实应当把它作为具有比冲击其他开发人员之外,没有其他好的目的所憎恶的。 其实,你也许可以用它下的赌注,这将汇编,对谁从来没有见过它乡亲当事人赢得一些钱...

这里是那种其中有正义感的程序员认为那些是无效的方法:

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


Answer 2:

就像是

  String[] a; 

是相同的

  String a[];

同一作品方法的返回类型的语法

  public static String mySplit(String s)[] {

是相同的

  public static String[] mySplit(String s) {

但我觉得我从来没有看见你在生产代码中提到尚未版本。



Answer 3:

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

String[] array
String array[]

这是一个东西C语言开发人员做的,所以它被列入,以帮助他们。



Answer 4:

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

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

类似声明变量:

String myStringArray[];

相当于

String[] myStringArray;


Answer 5:

好问题; 当我实现了一个Java解析器我记得在这一点上JLS语法变得非常困惑。

为了对约翰的回答扩大,这里是发生了什么:

  • 这就是所谓的“混合符号”在规范
  • 的语法打破类型声明成两片,其中的每一个可以具有0个或多个[]小号

有(至少)5米的地方,这很重要:

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

这里是从语法的摘录,注重方法的声明:

MethodOrFieldDecl:
    Type Identifier MethodOrFieldRest

MethodOrFieldRest:  
    FieldDeclaratorsRest ;
    MethodDeclaratorRest

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

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

(注意:这是难以阅读语法因为方大括号有时文字,有时元字符。)

这表明[]可以出现二者下的Type的规则,并且作为部分MethodDeclaratorRest规则。 正是在这两个地方可选。



Answer 6:

是的,这是允许的,

同样的原因是:

String[] myArray;

相当于

String myArray[];


文章来源: Strange array return type