Ich habe einige ältere Java-Code, der eine generische payload
Variable irgendwo außerhalb meiner Kontrolle definiert (dh ich nicht seine Art ändern kann):Mischen von Scala und Java: Wie generisch typisierte Konstruktor Parameter richtig erhalten?
// Java code
Wrapper<? extends SomeBaseType> payload = ...
I einen solchen payload
Wert als Methodenparameter erhalten in meinem Code und möchte es an eine Scala weiterleiten case class
(als Nachricht mit einem Actor-System zu verwenden), aber nicht die Definitionen richtig, so dass ich nicht mindestens eine Compiler-Warnung erhalten.
// still Java code
ScalaMessage msg = new ScalaMessage(payload);
Dies ergibt eine Compiler-Warnung "Typ Sicherheit: contructor ... gehört zur rohen Art ..."
Die Scala case class
wie folgt definiert ist:
// Scala code
case class ScalaMessage[T <: SomeBaseType](payload: Wrapper[T])
Wie kann ich definieren die Fall-Klasse, so dass der Code sauber kompiliert? (Leider, Ändern Sie den Code der Java Wrapper
Klasse oder den Typ des payload
Parameter ist keine Option)
Aktualisiert den Ursprung der Nutzlast Parameter
Added Zum Vergleich zu klären, in Java kann ich einen Parameter nur in der gleichen Art und Weise definieren, wie die payload
Variable definiert ist:
// Java code
void doSomethingWith(Wrapper<? extends SomeBaseType> payload) {}
und nennen es acco rdingly
// Java code
doSomethingWith(payload)
Aber ich kann z. ein Wrapper-Objekt direkt ohne eine Warnung "Rohtyp" zu erhalten. Hier, ich brauche eine static
Hilfsmethode zu verwenden:
static <T> Wrapper<T> of(T value) {
return new Wrapper<T>(value);
}
und verwende diese statischen Helfer ein Wrapper
Objekt zu instanziiert:
// Java code
MyDerivedType value = ... // constructed elsewhere, actual type is not known!
Wrapper<? extends SomeBaseType> payload = Wrapper.of(value);
Lösung
ich eine ähnliche Hilfsmethode hinzufügen zu einem Scala-Begleitobjekt:
// Scala code
object ScalaMessageHelper {
def apply[T <: SomeBaseType](payload: Wrapper[T]) =
new ScalaMessage(payload)
}
object ScalaMessageHelper2 {
def apply[T <: SomeBaseType](payload: Wrapper[T]) =
ScalaMessage(payload) // uses implicit apply() method of case class
}
und nutzen diese von Java die ScalaMessage
Klasse w/o Probleme zu instanziiert:
// Java code
ScalaMessage msg = ScalaMessageHelper.apply(payload);
Es sei denn, jemand mit einer eleganteren Lösung kommt, ich dies als eine Antwort extrahieren ...
Danke !
Funktioniert nicht, da ich tatsächlich einen Methodenparameter vom Typ 'Wrapper 'in Java, das in den Block des Codes übergeben wird, den wir diskutieren. Ich werde die ursprüngliche Frage entsprechend aktualisieren. –
Ich habe ein Update gemacht, überprüfen Sie es. –