【问题标题】:Weird "[]" after Java method signatureJava方法签名后奇怪的“[]”
【发布时间】:2011-06-09 14:48:04
【问题描述】:

今天看了一些Java代码,发现语法有点怪:

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

我认为无法编译并想修复我认为是错字的地方,但后来我记得 Java 编译器确实接受了它!

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

【问题讨论】:

标签: java arrays syntax


【解决方案1】:

由于有一个 C 标记,我将指出在 C 和 C++ 中可以使用类似(但不相同)的符号:

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

int tab[10];

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

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

【讨论】:

  • 函数返回指向 n 维数组的指针是否有更简单的语法? (不仅仅是一个 int*)
  • 其实我必须补充一下,pcc 直接支持f()[],意思是(*f())
【解决方案2】:

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

【讨论】:

  • 来自混淆器?更有可能来自 C 程序员(你不能返回一个数组,而是一个指向数组类型的指针 - 是的......而且看起来很相似)。
  • @Kos:你为什么暗示混淆器和 C 程序员必须是两个不同的东西?很多时候他们不是!
【解决方案3】:

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

Java Language Specification(8.4 方法声明)

为了与旧版本的 Java 平台兼容,声明表单 对于返回数组的方法,允许放置(部分或全部)空 在参数列表之后形成数组类型声明的括号对。

这是由过时的产品支持的:

方法声明器
方法声明器 [ ]

但不应在新代码中使用。

【讨论】:

  • 最好的一点是它是部分或全部。因此,如果您有一个方法返回一个 3 维整数数组,您可以这样做:public int[] foo()[][] {,让人们的眼睛流血。
  • 我不得不说我是在大声笑,因为我看到了那个代码! :-D
【解决方案4】:

java 的语法允许:

int[] intArr = new int[0];

还有

int intArr[] = new int[0];

c 风格的语法看起来更熟悉。

同样,使用函数,名称可以在[]之前或之后,类型仍然是int[]

【讨论】:

  • 这真的让我很恼火,因为它真的应该是 int[] 因为它是一个数组的事实是类型的一部分,而不是它的名称的一部分。编写我的 uni java 课程的研究生在他的代码中一直在做相反的事情,太可怕了!
  • @danpalmer,我同意,尽管把自己放在一个 c 程序员的鞋子里,他天生就有写 int name[] 的血统。无论如何,这没什么大不了的,该语言同时支持这两种语言,并且大多数 Java 程序员都使用 int[] 约定,因此除了烦人的一两个研究生之外,它很少见。谁知道呢,如果他们在你的期末考试中提出这样的问题,它甚至可能对你有利
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-05
  • 1970-01-01
  • 2018-10-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多