Per 4 o meno elementi, qualcosa di simile funziona (o almeno compila):
import scala.collection.immutable.Map;
Map<String,String> HAI_MAP = new Map4<>("Hello", "World",
"Happy", "Birthday",
"Merry", "XMas",
"Bye", "For Now");
Per un quinto elemento I potrebbe fare questo:
Map<String,String> b = HAI_MAP.$plus(new Tuple2<>("Later", "Aligator"));
Ma voglio sapere come inizializzare una mappa immutabile con 5 o più elementi e sto agitando in Tipo-inferno.
Soluzione parziale
Ho pensato di capirlo rapidamente compilando ciò che volevo in Scala, quindi decompilando i file di classe risultanti. Ecco la scala:
object JavaMapTest {
def main(args: Array[String]) = {
val HAI_MAP = Map(("Hello", "World"),
("Happy", "Birthday"),
("Merry", "XMas"),
("Bye", "For Now"),
("Later", "Aligator"))
println("My map is: " + HAI_MAP)
}
}
Ma il decompilatore mi ha dato qualcosa che ha due periodi consecutivi e quindi non verrà compilato (non lo faccio pensa che questo sia valido Java):
scala.collection.immutable.Map HAI_MAP =
(scala.collection.immutable.Map)
scala.Predef..MODULE$.Map().apply(scala.Predef..MODULE$.wrapRefArray(
scala.Predef.wrapRefArray(
(Object[])new Tuple2[] {
new Tuple2("Hello", "World"),
new Tuple2("Happy", "Birthday"),
new Tuple2("Merry", "XMas"),
new Tuple2("Bye", "For Now"),
new Tuple2("Later", "Aligator") }));
Sono davvero sconcertato dai due periodi in questo:
scala.Predef..MODULE$
Ho chiesto informazioni su #java
su Freenode e hanno detto che ..
sembrava un bug del decompilatore. Non sembra voler compilare, quindi penso che probabilmente abbiano ragione. Ci sto provando quando cerco di esplorare le interfacce in IntelliJ e sono generalmente perduto.
In base alla mia sperimentazione, è valida quanto segue:
Tuple2[] x = new Tuple2[] { new Tuple2<String,String>("Hello", "World"),
new Tuple2<String,String>("Happy", "Birthday"),
new Tuple2<String,String>("Merry", "XMas"),
new Tuple2<String,String>("Bye", "For Now"),
new Tuple2<String,String>("Later", "Aligator") };
scala.collection.mutable.WrappedArray<Tuple2> y = scala.Predef.wrapRefArray(x);
Esiste anche un metodo WrappedArray.toMap()
, ma i tipi di firma sono complicati e sto anche correndo nel problema del doppio periodo quando provo a ricercare le interfacce da Java.