2010-06-11 11 views

Respuesta

7

Scala escribe esos símbolos especiales salen como $ más, $ menos, etc. Puede verlo usted mismo ejecutando javap contra scala.collection.immutable.HashSet.

Eso le permite hacer un código como éste:

Set s = new HashSet<String>(); 
s.$plus("one"); 

No es bonita, y que en realidad no funciona en tiempo de ejecución! Obtienes un NoSuchMethodError. Supongo que está relacionado con this discussion. Usando la solución que discuten, puede hacer que las cosas funcionen:

import scala.collection.generic.Addable; 
import scala.collection.generic.Subtractable; 
import scala.collection.immutable.HashSet; 
import scala.collection.immutable.Set; 

public class Test { 
    public static void main(String[] args) { 
     Set s = new HashSet<String>(); 
     s = (Set<String>) ((Addable) s).$plus("GAH!"); 
     s = (Set<String>) ((Addable) s).$plus("YIKES!"); 
     s = (Set<String>) ((Subtractable) s).$minus("GAH!"); 
     System.out.println(s); // prints Set(YIKES!) 
    } 
} 

¿No es eso una belleza?

Creo Java 7 va a permitir nombres de los métodos cobardes que se escaparon, así que tal vez para entonces podrás hacer

s = s.#"-"('GAH!') 

Para probar esto, es necesario scala-library.jar de la lib/carpeta de la distribución de Scala.

Actualización: sintaxis fija de Java 7, gracias Mirko.

+2

Por desgracia, la sintaxis de Java 7 para llamar nombres exóticos (http://bugs.sun.com/view_bug.do?bug_id=6746458) no es tan hermosa: s = s. # "-" ('GAH!') –

+0

No estoy usando Scala 2.8.0 (que tiene todas las cosas Admitibles/Subtractables) y no necesitaba usar el casting ... la clave para mí era la denominación (p. ej. "$ plus" y "$ minus") y scala-library.jar - ¡gracias! –

0

Sobre la base de la respuesta de Adán, el siguiente me da buenos resultados con Scala 2.7.7 bajo Eclipse:

package com.example.test.scala; 

import scala.collection.immutable.HashSet; 
import scala.collection.immutable.Set; 

public class ImmutableSetTest1 { 
    public static void main(String[] args) { 
     Set s0 = new HashSet<String>(); 
     Set[] s = new Set[3]; 
     s[0] = s0.$plus("GAH!"); 
     s[1] = s[0].$plus("YIKES!"); 
     s[2] = s[1].$minus("GAH!"); 

     for (int i = 0; i < 3; ++i) 
      System.out.println("s["+i+"]="+s[i]); 
    } 
} 

que imprime:

s[0]=Set(GAH!) 
s[1]=Set(GAH!, YIKES!) 
s[2]=Set(YIKES!) 
2

se puede usar esta opción si es sólo para init un conjunto de menos de 5 elementos

import scala.collection.immutable.Set; 

Set mySet = (Set<String>)new Set.Set1<String>("better") 
Set mySet = (Set<String>)new Set.Set2<String>("better","andmore") 

Otro Manera de hacerlo es la siguiente:

import scala.collection.JavaConversions$; 
import scala.collection.immutable.Set; 
import scala.collection.immutable.Set$; 


//code 

java.util.HashSet hashsSet = new java.util.HashSet<String>(); 
     hashsSet.add("item1"); 
     hashsSet.add("item2"); 
     hashsSet.add("item3"); 
     hashsSet.add("item4"); 
     hashsSet.add("item5"); 
     // this is the mutable set of scala 
     scala.collection.mutable.Set scalaSet = JavaConversions$.MODULE$.asScalaSet(hashsSet); 
//this is immutable set 
     Set immutable = scalaSet.toSet(); 

     System.out.println(immutable);