2016-08-29 8 views
0

Ich muss einige Erweiterungsmethoden in meinem Java-Code erstellen. Ich habe einige Posts hier in SO gelesen und Leute schlagen XTend oder Scala vor, um dies zu erreichen.C# Erweiterung Methoden in Java mit Scala

Nun wäre meine Frage .. wenn ich eine Art Adapterschicht in Scala schreibe (dort meine Erweiterungsmethoden hinzufüge) und dann dieses Projekt als Abhängigkeit für mein eigenes Java-Projekt verwende, sind diese erweiterten Methoden für mich verfügbar zu verwenden, oder sie sind nur für den "Umfang des Scala-Projekts" definiert und dann kann die JVM-Ausgabe diese neuen Methoden nicht für das andere Projekt bereitstellen, das sie verwendet?

EDIT: Was ich tun muss, ist eine vollständige Hierarchie der Klassen in einer bestimmten Bibliothek zu erweitern und einige neue Funktionalität geben. Was den ersten Ansatz von Java betrifft, so sollte ich jede Klasse in dieser Hierarchie erweitern, indem ich eine eigene Hierarchie erweiterter Klassen erstelle und die neue Methode dort hinzufüge. Ich möchte das vermeiden und dem Endanwender den Sinn nativer Funktionalität in der ursprünglichen Hierarchie geben.

Grüße.

+2

C# -Erweiterungsmethoden sind nur syntaktische Zucker für statische Methoden, die eine Instanz des erweiterten Typs als erstes Argument verwenden. –

+1

Sagen wir es so: Was genau ist das Problem, das Sie mit diesem (komplizierten?) Ansatz lösen wollen? – GhostCat

+0

Ich stimme dem "syntaktischen Zucker" nicht völlig zu. Es gibt dem Endanwender eine wirklich semantische Nutzung der zusätzlichen Funktionalität, aber ok, darüber werde ich nicht streiten. Ich habe den ursprünglichen Beitrag bearbeitet, um einen Hintergrund meines Szenarios zu geben. –

Antwort

0

Wie oben in den Kommentaren erwähnt, ist es sehr nah an C#, aber nicht genau dort wegen der Art Löschen. Zum Beispiel funktioniert das gut:

object myLibExtensions { 
    implicit class TypeXExtension(val obj: TypeX) extends AnyRef { 
     def myCustomFunction(a: String): String = { 
      obj.someMethod(a) 
     } 
    } 
} 

Es wird etwas ähnlich wie C# Erweiterungsmethoden, das heißt erzeugt statische Methode Wrapper in begründeten Fällen (but not always) handeln.

Das einzige, was ich in Scala vermisse ist, dass Sie nicht (oder zumindest konnte ich nicht herausfinden, wie) die Werte der Typen, die erweitert werden, zurückgeben. Zum Beispiel nehme ich an so etwas wie eine Erweiterungsmethode „withMeta“ haben will, die wie folgt funktioniert:

class TypeY extends TypeX { def methodOfY(...) ...} 

var y: TypeY = .... 

y.withMeta(...).methodOfY(...) 

folgenden Grund nicht für mich arbeiten:

object myLibExtensions { 
    private val something = .... 
    implicit class Extension[T<:TypeX](val obj: T) extends AnyRef { 
     def withMeta(meta: Meta[T]): T = { 
      something.associateMeta(obj,meta) 
      val 
     } 
    } 
} 

... weil T in TypeX gelöscht werden. Daher müssen Sie in diesem Fall Erweiterungen für alle spezifischen Blattklassen der Hierarchie schreiben, was sehr traurig ist.