Puoi solo fare questo, ed è già abbastanza difficile che tu non voglia.
Quello che non è possibile do è scrivere una classe Java nuda che magicamente viene interpretata come getter e setter Scala. La ragione è che Scala incorpora le informazioni nel file di classe che richiede per i suoi getter e setter (ad esempio ci sono zero blocchi di parametri o un blocco di parametri vuoto - una distinzione che non è conservata sulla JVM (o in Java)).
Cosa si può fare è utilizzare Java per implementare un'interfaccia Scala definita (es tratto):
// GetSetA.scala
trait GetSetA { def a: Int; def a_=(a: Int): Unit }
// JavaUsesGSA.java
public class JavaUsesGSA implements GetSetA {
private int a = 0;
public int a() { return a; }
public void a_$eq(int a) { this.a = a; }
}
Quello che non si può fare, anche così, è utilizzare direttamente la classe (ancora una volta perché Java non aggiunge le informazioni appropriate annotazioni per Scala):
scala> j.a = 5
<console>:8: error: reassignment to val
j.a = 5
ma dal momento che non implementare il tratto di successo LY, si può utilizzare, se lo desideri quando viene digitato come il tratto:
scala> (j: GetSetA).a = 5
(j: GetSetA).a: Int = 5
Quindi è piuttosto un miscuglio. Non è perfetto in alcun modo, ma in alcuni casi potrebbe essere abbastanza funzionale da dare una mano.
(L'altra alternativa, naturalmente, è quello di fornire una conversione implicita dalla classe Java per uno che ha un getter/setter che fa riferimento i metodi reali sulla classe Java; questo funziona anche quando non si può avere la Java ereditare da Scala)
(Edit:. Naturalmente non c'è ragione fondamentale che il compilatore deve agire in questo modo, si potrebbe sostenere che l'interpretazione Java-definiti coppie getter/setter come se fossero quelli Scala (cioè se il file di classe non dice esplicitamente che è di Scala) è un buon candidato per un miglioramento delle funzionalità per migliorare l'interoperabilità Java.
fonte
2012-06-05 14:19:41
Sto lavorando molto con EMF (model2model, model2text transformation) quindi ho pensato di rendere il codice un po 'più elegante con feature = value invece di setFeatute (valore). – fikovnik