2014-07-23 3 views
5

ich die statische MethodeScala implizite Konvertierung nicht auf Java Argument Muster angewendet zu werden

static void foo(Object... params) 

in der Java-Klasse Bar gegeben haben und planen, es zu nennen wie folgt:

Bar.foo('x') 

, die nicht arbeiten, weil die Methode ein Java-Zeichen erwartet und irgendwie die vorhandene implizite Konvertierung nicht angewendet wird.

Bar.foo('x' : Character) 
Bar.foo(new Character('x')) 

werden beide den Trick tun, aber die Lesbarkeit verletzt. Putting diese Konstrukte in eine implizite Konvertierung

implicit def baz(c : Char) = c : Character 

funktioniert nicht und ich verstehe nicht warum. Also meine Fragen: Was ist das Problem hier? Gibt es eine Lösung?

+0

Mit Scala 2.11.1 ich die folgende Fehlermeldung zu sehen: mario @ Tumbolia/tmp/test 1024% scalac * Foo.scala: 2: Fehler: der Ergebnistyp einer impliziten Umwandlung spezifischer sein müssen als AnyRef Bar.foo ('x') ^ ein Fehler gefunden –

Antwort

3

Der Compiler ist sehr spezifisch darüber, warum es eine dieser implicits nicht nutzen:

error: the result type of an implicit conversion must be more specific than AnyRef 

Object ist ein Synonym für AnyRef und becaue das ist der Wert, den es braucht foo es jeder anwenden weigert anrufen implizite Konvertierungen

Sie können jedoch eine Hülle um Bar.foo definieren, damit Sie wörtliche Zeichen verwenden:

def barFoo(chars: Character*) = Bar.foo(chars.toArray: _*) 
barFoo('x') 
+0

Die Gründe dafür sind in https://issues.scala-lang.org/browse/SI-6899 und der verknüpften Google Groups Konversation (https : //groups.google.com/forum/? fromgroups = #! topic/scala-internals/cwEyQCmjX24) –

1

Die einzigen Variablen, die einen Objekttyp gegossen werden können diejenigen sind, die Klasseninstanz sind. Das schließt Basistyp wie int, boolean, double aus. Diese müssen transformiert werden, bzw. auf den Typ: Integer, Boolean, Double.

Verwandte Themen