奇怪的数组返回类型

Pet*_*rey 72 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));
}
Run Code Online (Sandbox Code Playgroud)

版画

[a, b, c, d, e]
Run Code Online (Sandbox Code Playgroud)

在过去,奇怪的符号一直是"C"兼容性,但我不会想象有人在C中写这个.

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

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

这在Java 6中也是如此.http://ideone.com/91rZV1


BTW这不编译,我也不期望它

public static <T> List mySplit(String s)<T> {
    return Collections.emptyList();
}
Run Code Online (Sandbox Code Playgroud)

Jon*_*eet 90

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

在这种情况下,它是为了向后兼容Java本身.从JLS第8.4节:

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

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

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

public String[] mwahahaha(String[] evil[])[] {
    return evil;
}
Run Code Online (Sandbox Code Playgroud)

  • +1我没有被邀请参加那种派对.;) (15认同)
  • @JanDvorak大多数开发人员都非常擅长忽略我发现的静态分析和编译器警告. (4认同)
  • @PeterLawrey:我试过混合两者,但得到了:"变量arity参数不允许使用遗留数组符号" (2认同)

MrS*_*h42 19

就像是

  String[] a; 
Run Code Online (Sandbox Code Playgroud)

是相同的

  String a[];
Run Code Online (Sandbox Code Playgroud)

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

  public static String mySplit(String s)[] {
Run Code Online (Sandbox Code Playgroud)

是相同的

  public static String[] mySplit(String s) {
Run Code Online (Sandbox Code Playgroud)

但我想我还没有看到你在高效代码中提到过的版本.

  • 我不认为我也见过它; 我应该发帖给TDWTF (2认同)

Pet*_*ott 6

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

String[] array
String array[]
Run Code Online (Sandbox Code Playgroud)

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

  • "这是C开发人员所做的事情,所以它被包含在内以帮助他们." < - 如果你有关于这一点的文章,我想指点,它可能是一个有趣的阅读!(特别是因为我以前_did_ C并且不能在我的生活中开始理解Java符号) (2认同)