73

[]このようなメソッドシグネチャの後に配列が配置されているのを見た人はいますか?

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 7update10を使用しています。

これは、Java6でも同じことを行います。http://ideone.com/91rZV1


ところで、これはコンパイルされませんし、私はそれを期待しません

public static <T> List mySplit(String s)<T> {
    return Collections.emptyList();
}
4

6 に答える 6

90

なぜこれが許可されているのか誰かが知っていますか?

この場合、Java自体との下位互換性のためです。JLSセクション8.4から:

古いバージョンのJavaSEプラットフォームとの互換性のために、配列を返すメソッドの宣言では、正式なパラメーターリストの後に配列型の宣言を形成する空のブラケットペア(の一部またはすべて)を配置できます。これは、次の廃止された製品でサポートされていますが、新しいコードでは使用しないでください。

そして、はい、あなたは確かにそれを他の開発者に衝撃を与える以外に良い目的を持たない忌まわしきものと見なすべきです。実際、これを見たことがない人に対しては、コンパイルすることを賭けて、パーティーでいくらかのお金を稼ぐためにそれを使用できるかもしれません...

善意のコーダーが無効であると予想する種類のメソッドは次のとおりです。

public String[] mwahahaha(String[] evil[])[] {
    return evil;
}
于 2013-01-07T20:15:55.253 に答える
19

まるで

  String[] a; 

と同じです

  String a[];

メソッドの戻り型の構文についても同じように機能します

  public static String mySplit(String s)[] {

と同じです

  public static String[] mySplit(String s) {

しかし、私はあなたが生産的なコードで言及したバージョンをまだ見たことがないと思います。

于 2013-01-07T20:17:30.410 に答える
6

次の変数宣言が両方とも同等であるのと同じ理由だと思います

String[] array
String array[]

これはC開発者が行うことなので、彼らを助けるために含まれていました。

于 2013-01-07T20:16:01.490 に答える
4

Strings宣言するのと同じように、戻り型がの配列であることをJavaに伝えているだけだと思います

static String[] mySplit(String s) {...

変数の宣言に似ています:

String myStringArray[];

と同等です

String[] myStringArray;
于 2013-01-07T20:16:03.957 に答える
4

良い質問; Javaパーサーを実装したとき、この時点でJLS文法に本当に混乱したことを覚えています。

ジョンの答えを拡張するために、ここで何が起こっているのかを説明します。

これが重要な場所は(少なくとも)5つあります。

  • メソッド型シグネチャ
  • ローカル変数宣言
  • フィールド宣言
  • 正式なパラメータ
  • for-ループ

メソッド宣言に焦点を当てた、文法からの抜粋を次に示します。

MethodOrFieldDecl:
    Type Identifier MethodOrFieldRest

MethodOrFieldRest:  
    FieldDeclaratorsRest ;
    MethodDeclaratorRest

MethodDeclaratorRest:
    FormalParameters {[]} [throws QualifiedIdentifierList] (Block | ;)

Type:
    BasicType {[]}
    ReferenceType  {[]}

(警告:角括弧と中括弧はリテラルである場合とメタ文字である場合があるため、文法を読むのは困難です。)

これは、ルールの下とルールの一部の[]両方に表示される可能性があることを示しています。どちらの場所でもオプションです。TypeMethodDeclaratorRest

于 2013-01-08T23:22:36.143 に答える
1

はい、これは許可されています、

同じ理由:

String[] myArray;

と同等です

String myArray[];
于 2013-01-08T09:19:47.653 に答える