Warum Java-Zahlen nicht iterierbar sind

7

Ich kann mich nicht fragen, warum ich so etwas nicht schreiben kann:

%Vor%

zum Ausdrucken:

%Vor%

Ich meine, 3 könnte in ein Integer automatisch eingereiht werden, was Iterable sein könnte.
Ich weiß, ich habe das erste Element als 0 ausgewählt, aber ich nehme an, es ist der übliche Fall und es könnte das Zählen mit solch einem ForEach Konstrukt erleichtern.

    
Asaf 02.05.2011, 15:22
quelle

7 Antworten

10

Das ist irgendwie dumm, aber Sie könnten so etwas schreiben:

%Vor%

wenn Sie die Methode statisch importieren würden:

%Vor%

aus dieser benutzerdefinierten Klasse:

%Vor%     
Matej Tymes 02.05.2011, 15:52
quelle
9

Weil eine Zahl kein Bereich ist. Konvertieren einer Zahl in einen Bereich ist mehrdeutig. Es gibt nichts, was Sie daran hindert, eine Range-Klasse zu schreiben, die ist iterierbar ist, zum Beispiel

%Vor%

Beachten Sie, dass Sie bei einem solchen Ansatz einfach Funktionen wie die Angabe des Inkrements hinzufügen können, ob der Bereich auf beiden Seiten eingeschlossen ist usw.

    
Dilum Ranatunga 02.05.2011 15:34
quelle
4

Sie iterieren über Sammlungen von Objekten. und Integer ist ein einzelnes Objekt, über das nichts zu iterieren ist. Sie können dies jedoch tun:

%Vor%     
John Kane 02.05.2011 15:28
quelle
4

In Java wird die foreach -Schleife nur über Arrays oder Sammlungen, die die Iterable -Schnittstelle implementieren, die Wrapper-Typ Integer nicht.

Aber es macht Sinn, wenn Sie darüber nachdenken. Was bedeutet "für jede ganze Zahl i in 3, das tun"? Wie viele Ganzzahlen sind in 3? Beginnen wir bei Null, also gibt es 4 ganze Zahlen (0,1,2,3)? Beginnen wir bei 1? Gehen wir notwendigerweise immer einen Schritt nach dem anderen?

Wenn Sie dieses Verhalten nachahmen möchten, TheOtherGuy Antwort wird funktionieren, aber eine direkte Schleife ist wahrscheinlich noch besser.

    
Zach L 02.05.2011 15:29
quelle
4

In for(x : c) Syntax muss c ein Iterable sein; 3 ist nicht. Sie können

tun %Vor%     
TheOtherGuy 02.05.2011 15:24
quelle
2

Wie andere bereits festgestellt haben, iteriert Java für jedes Element ein Array oder eine Sammlung. "3" ist kein Array oder eine Sammlung, es ist ein einzelner Wert. Wenn Java das von Ihnen vorgeschlagene Konstrukt zuließ, würde die einzige konsistente Implementierung darin bestehen, über den einzelnen Wert 3 zu "iterieren". Das heißt:

%Vor%

würde ausgeben:

%Vor%

Was nicht sehr nützlich scheint, weshalb sie es wahrscheinlich nicht implementiert haben.

Ihre Frage geht davon aus, dass ein einzelner Wert wie "3" einen Bereich impliziert. Aber warum nimmst du {0,1,2,3} an? Warum nicht {1,2,3}? Oder {-3, -2, -1, 0, 1, 2, 3}? Oder {0.5, 1.0, 1.5, 2.0, 2.5, 3}? Oder eine buchstäblich unendliche Anzahl anderer möglicher Variationen.

Um es konkret zu machen, müssten Sie den Anfangswert, den Endwert und das Inkrement angeben. Hmm, vielleicht könnten wir uns eine Notation ausdenken:

%Vor%

Aber das ist immer noch zweideutig. Es ist nicht klar, ob wir fortfahren wollen bis i == 3 oder bis zum letzten Wert & lt; 3. Und wir müssen wahrscheinlich ein Plus-Inkrement von einem Minus-Inkrement unterscheiden. Wie wäre es mit dieser flexibleren Schreibweise:

%Vor%

Oh, warte, das wird schon unterstützt. : -)

    
Jay 02.05.2011 16:18
quelle
1

Number hat nicht ganzzahlige Unterklassen wie Float und BigDecimal, daher ist es nicht sinnvoll, Iterable <Integer> on Number zu implementieren. Integer und Long implementieren Iterable <Integer|Long & gt; wäre aber nett.

    
sbridges 02.05.2011 15:33
quelle

Tags und Links