Java方法签名后奇怪的“ []”


119

我今天看了一些Java代码,发现了一些奇怪的语法:

public class Sample {
  public int get()[] {
    return new int[]{1, 2, 3};
  }
}

我以为那是无法编译的,所以想修复我认为是错字的东西,但是后来我想起Java编译器确实接受了它!

有人可以帮我理解它的意思吗?它是功能数组吗?


10
哇,真是..... D
Nanne


2
最疯狂的……我见过的东西。他们说红宝石有很多魔力,那就吃红宝石吧!
IAdapter 2011年

16
与将函数的指针返回指向C中函数的指针数组的函数的签名相比,它看起来甚至都不是很奇怪::
Kos

Answers:


111

这是一个返回的方法int[]

Java语言规范(8.4方法声明)

为了与Java平台的较早版本兼容,允许将用于返回数组的方法的声明形式放在参数列表之后的空括号对中(部分或全部),这些空括号对构成了数组类型的声明。

过时的生产支持了这一点:

MethodDeclarator
    MethodDeclarator []

但不应在新代码中使用。


92
最好的一点是它是全部或部分。因此,如果您有一种返回3维整数数组的方法,则可以执行以下操作: public int[] foo()[][] {并使人的眼睛流血。
科恩

我不得不说,自从看到该代码以来,我一直在大声笑!:-D
sdlins

20

这是一个有趣的问题。在Java中,您可以说int[] a;以及int a[];
从这个角度来看,为了获得相同的结果,只需要移动[]
和写入即可public int[] get() {
看起来代码仍然来自混淆器...


2
来自混淆器?更有可能来自C程序员(您不能返回数组,但可以指向数组类型的指针-是的,它看起来很相似)。
科斯

4
@Kos:为什么要暗示混淆器和C程序员必须是两个不同的人?很多时候他们不是!
2015年

10

由于有一个C标记,我将指出在C和C ++中可能有类似(但不相同)的表示法:

这里的函数f返回一个指向10个整数的数组的指针。

int tab[10];

int (*f())[10]
{
    return &tab;
}

Java根本不需要星号和括号。


函数返回n维数组的指针是否有更简单的语法?(不仅仅是int *)
TED

实际上,我必须补充一点,pcc直接支持f()[]类似的含义(*f())
AnArrayOfFunctions

4

java的语法允许以下内容:

int[] intArr = new int[0];

并且

int intArr[] = new int[0];

从c样式的语法来看,它看起来更为重要。

同样,通过函数,名称可以在[]之前或之后,并且类型仍然是int []


1
这确实让我很烦,因为它实际上应该是int [],因为它是数组的事实是类型的一部分,而不是名称的一部分。编写我的uni java课件的postgrad在他的代码中一直在做相反的事情,太可怕了!
danpalmer 2011年

1
@danpalmer,我同意,尽管让自己陷入了一个交流程序员的脑海,他本来就以写int名称[]为生。无论如何,它不是什么大问题,该语言支持这两种语言,并且大多数Java程序员都使用int []约定,因此除了烦人的一两个postgrad之外,它很少见。谁知道,如果他们在决赛中问这样的问题,它甚至可能对您有帮助
davin 2011年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.