2010-06-11 10 views

risposta

7

Scala scrive quei simboli speciali come $ plus, $ meno, ecc. Puoi vederlo da solo eseguendo javap su scala.collection.immutable.HashSet.

che ti permette di fare il codice come questo:

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

Non abbastanza, e in realtà non funziona in fase di esecuzione! Ottieni un NoSuchMethodError. Suppongo che sia relativo a this discussion. Usando la soluzione che discutono, puoi far funzionare le cose:

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!) 
    } 
} 

Non è una bellezza !?

Credo Java 7 sta per consentire i nomi dei metodi funky da sfuggiti, quindi forse per allora sarete in grado di fare

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

Per provare questo, è necessario scala-library.jar dal lib/cartella della distribuzione Scala.

Aggiornamento: sintassi Java 7 corretta, grazie Mirko.

+2

Sfortunatamente, la sintassi di Java 7 per chiamare nomi esotici (http://bugs.sun.com/view_bug.do?bug_id=6746458) non è poi così bella: s = s. # "-" ('GAH!') –

+0

Non sto usando Scala 2.8.0 (che ha tutto quel materiale Addable/Subtractable) e non ho avuto bisogno di usare il cast ... la chiave per me era la denominazione (es "$ plus" e "$ meno") e la scala-library.jar - grazie! –

0

in base alla risposta di Adamo, il seguente funziona bene per me con Scala 2.7.7 in 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]); 
    } 
} 

che stampa:

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

È possibile utilizzare questo se solo per init un insieme di meno di 5 articoli

import scala.collection.immutable.Set; 

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

Altro Modo per farlo è la seguente:

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);