Javaメソッド署名後の奇妙な「[]」


119

今日いくつかのJavaコードを調べたところ、奇妙な構文が見つかりました。

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

コンパイルできないと思って、タイプミスと思われるものを修正したかったのですが、Javaコンパイラが実際にそれを受け入れたことを思い出しました!

誰かが私がそれが何を意味するのか理解するのを手伝ってくれませんか?関数の配列ですか?


10
うわー、それは..奇妙な...; D
ナネ


2
クレイジーな...私が今まで見たもの。彼らはルビーにはたくさんの魔法があると言っています、そのルビーを食べてください!
IAdapter

16
Cの関数へのポインターの配列へのポインターを返す関数のシグネチャと比較して、リモートで奇妙に見えません。:)
Kos

回答:


111

これはを返すメソッドですint[]

Java言語仕様(8.4メソッド宣言)

古いバージョンのJavaプラットフォームとの互換性のために、配列を返すメソッドの宣言フォームでは、パラメーターリストの後に配列型の宣言を形成する空のブラケットペア(の一部またはすべて)を配置できます。

これは陳腐化したプロダクションによってサポートされています:

MethodDeclarator
    MethodDeclarator []

新しいコードでは使用しないでください。


92
これの最良の部分は、それがの一部またはすべてであることです。したがって、intの3次元配列を返すメソッドがある場合は、次のことができます。 public int[] foo()[][] {そして、人々の目を出血させます。
Cowan

私はそのコードを見てから大声で笑っていると言わざるを得ません!:-D
sdlins 2018

20

それは面白い質問です。Java int[] a;では、だけでなく、と言うこともできますint a[];
この観点から見ると、同じ結果を得るには、を移動し[]
て書き込む必要がありますpublic int[] get() {
それでもコードは難読化プログラムから来たようです...


2
難読化ツールから?Cプログラマーの可能性が高いです(配列を返すことはできませんが、配列型へのポインター-はい、そしてそれは似ています)。
Kos

4
@Kos:難読化プログラムとCプログラマーが2つの異なるものでなければならないことを意味するのはなぜですか 多くの場合、そうではありません!
Lii

10

Cタグがあるので、CおよびC ++でも同様の(ただし同一ではない)表記が可能であることを指摘しておきます。

ここでは、関数fは10整数の配列へのポインターを返します。

int tab[10];

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

Javaは、スターと括弧を必要としません。


n次元配列へのポインタを返す関数の簡単な構文はありますか?(単なるint *ではありません)
2013年

実際、私は付け加えなければなりません、pccはのf()[]ようなものを直接意味します(*f())
AnArrayOfFunctions 2017年

4

javaの構文では、次のことが可能です。

int[] intArr = new int[0];

そしてまた

int intArr[] = new int[0];

これは、Cスタイルの構文からより見た目がよくなります。

そのため、関数の場合、名前は[]の前または後に来ることができ、型はint []のままです。


1
配列であるという事実は型の一部であり、名前の一部ではないため、これは本当にint []である必要があるため、本当に私を困らせます。私のuni Javaコースワークを書いている卒業生は、彼のコードでいつも逆のことをしています。
ダンパルマー2011年

1
@danpalmer、私は同意しますが、int name []を書くために熱心にそれを熱心に持っているACプログラマーの立場に身を置きます。とにかく、それほど大したことではありませんが、この言語は両方をサポートしており、ほとんどのJavaプログラマーはint []規則を使用しています。誰もが知っていることですが、ファイナルでこのような質問をすると、うまくいくかもしれません
davin
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.