有没有人看到数组[]
放在方法签名之后呢?
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();
}
答案 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语法感到非常困惑。
为了扩展约翰的回答,这是正在发生的事情:
[]
s 至少有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[];