2017-07-28 2 views
3

Je demande cette curiosité comme je l'ai pas trouvé une question à cette erreur de compilation spécifique sur StackOverflow:Legacy pas autorisé sur le paramètre variable arité

Legacy array notation not allowed on variable-arity parameter

Je suis venu à travers la notation héritage en voyant un code contenant une signature comme celui-ci:

private void a(int ints[]){/*...*/}

Je joue arround un peu jusqu'à ce que je rencontrais l'erreur de compilation dans les exemples suivants.

// this method compiles as expected 
private void method1(int[][] ints){ /*...*/ } 

// this too 
private void method2(int[]... ints){ /*...*/ } 

// this does to, but makes use of legacy array notation 
private void method3(int ints[][]){ /*...*/ } 

// this still does, even when mixing up the notations 
private void method4(int[] ints[]){ /*...*/ } 

// this however fails to compile 
private void method5(int... ints[]){ /*...*/ } 

Y at-il une raison particulière pour laquelle le concepteur de langage a décidé de l'implémenter de cette façon? Ne pas autoriser varargs avec la notation de tableau hérité?

NOTE: I understand the legacy notation

Répondre

2

Je ne sais pas pourquoi ils ont décidé de le faire *, cependant, je voudrais simplement confirmer que cela fait partie formelle du cahier des charges et est entièrement destinée à produire une erreur de compilation:

It is a compile-time error to use mixed array notation (§10.2) for a variable arity parameter.

de JLS 8.4.1

* cette question serait basée sur les avis puisque personne d'autre que les concepteurs de langage Java pourrait vous dire. Si je devais spéculer, c'est probablement parce qu'autoriser plusieurs notations en premier lieu était une sorte de mauvaise idée.

+1

Merci, c'était la réponse que je cherchais :) – Lino

+1

et je suis d'accord que plusieurs notations * sont * une mauvaise idée – Lino

+1

@Lino C'est la principale problème avec Java ces jours-ci. Trop de bagages pour maintenir la compatibilité ascendante. Quelque chose comme Kotlin semble être le futur! – Michael

3

int[] a, int a[] sont la même chose,

si 1, 3 et 4 sont équivalents.

Dans 2, vous êtes essentiellement dire "je veux un varargs de type int []"

il peut être appelé comme method2(new int[]{},new int[]{}).

Dans 5, int.. indique au compilateur que c'est un vararg de type int et le nom du paramètre est considéré comme ints[], qui est le nom de la variable non valide.

+0

semble raisonnable, avez-vous la confirmation que c'est correct? – Lino

+0

bien, il ne semble y avoir aucune autre raison. Je veux dire que si vous supprimez '[]' dans le nom du paramètre de la dernière méthode, cela fonctionne. – Ramanlfc

+0

Pour la deuxième méthode, vous avez dit que vous pouvez lire la signature comme "* Je veux un varargs de type int [] *" donc vous ne pourriez pas dire la même chose de la cinquième méthode? "* Je veux un varargs de ints [] *" (le s ints [] est exprès) – Lino