奇怪的数组返回types
有没有人看到这样的方法签名之后放置的数组[]
?
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(); }
有谁知道为什么这甚至允许?
在这种情况下,它是为了与Java本身的向后兼容性。 从JLS部分8.4 :
为了与旧版本的Java SE平台兼容,返回数组的方法的声明允许在forms参数列表之后放置构成数组types声明的空括号对(的一部分或全部)。 这是由以下过时的生产支持,但不应在新的代码中使用。
是的,除了打击其他开发商之外,你的确应该把它看作是没有好处的可憎的东西。 实际上,你也许可以用它来赢取一些钱,通过打赌它会编译,对付从未见过的人…
以下是这种正确的编码器预期无效的方法:
public String[] mwahahaha(String[] evil[])[] { return evil; }
就像是
String[] a;
是相同的
String a[];
方法返回types的语法也是一样的
public static String mySplit(String s)[] {
是相同的
public static String[] mySplit(String s) {
但是我想我从来没有见过你在高效代码中提到的版本。
我认为它与下面的variables声明是相同的原因相同
String[] array String array[]
这是C开发人员所做的事情,所以它被包括来帮助他们。
我相信这只是告诉Java返回types是一个Strings
数组,就像声明一样
static String[] mySplit(String s) {...
类似于声明variables:
String myStringArray[];
相当于
String[] myStringArray;
好问题; 当我实现一个Javaparsing器时,我记得在这一点上被JLS语法困惑了。
为了扩大John的答案,下面是发生了什么事情:
- 这在规范中被称为“混合符号”
- 语法将types声明分成两部分,每部分可以有0个或更多个
[]
有(至less)5个地方,这一点很重要:
- 方法types签名
- 局部variables声明
- 现场声明
- forms参数
-
for
-loops
下面是语法的摘录,重点是方法声明:
MethodOrFieldDecl: Type Identifier MethodOrFieldRest MethodOrFieldRest: FieldDeclaratorsRest ; MethodDeclaratorRest MethodDeclaratorRest: FormalParameters {[]} [throws QualifiedIdentifierList] (Block | ;) Type: BasicType {[]} ReferenceType {[]}
(警告:阅读语法很困难,因为正方形和大括号有时是文字,有时是元字符。)
这表明[]
可以出现在Type
规则下,也可以作为MethodDeclaratorRest
规则的一部分出现。 在两个地方都是可选的。
是的,这是允许的,
同样的原因:
String[] myArray;
相当于
String myArray[];