2014-07-23 14 views
5

ho dato il metodo staticoScala conversione implicita non sempre applicato su Java modello argomento

static void foo(Object... params) 

nella classe Bar Java e il piano per chiamarlo come segue:

Bar.foo('x') 

che non funziona perché il metodo si aspetta un carattere Java e in qualche modo, la conversione implicita esistente non viene applicata.

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

entrambi fanno il trucco, ma fanno male la leggibilità. Mettere quei costrutti in una conversione implicita

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

non funziona e non capisco perché. Quindi le mie domande: Qual è il problema qui? C'è una soluzione?

+0

Con Scala 2.11.1 sto vedendo il seguente messaggio di errore: mario @ Tumbolia/tmp/test 1.024% scalac * Foo.scala: 2: Errore: il tipo di risultato di una conversione implicita deve essere più specifico di AnyRef Bar.foo ('x') ^ un errore trovato –

risposta

3

Il compilatore è molto specifico sul perché non utilizzare uno di questi impliciti:

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

Object è sinonimo di AnyRef, e becaue cioè il valore che ha bisogno di chiamare foo si rifiuta di applicare qualsiasi conversioni implicite.

Tuttavia, è possibile definire un wrapper Bar.foo per consentire di utilizzare i caratteri letterali:

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

I motivi sono indicati in https://issues.scala-lang.org/browse/SI-6899 e nella conversazione collegata di Google Gruppi (https :?! //groups.google.com/forum/ fromgroups = # argomento/Scala-internals/cwEyQCmjX24) –

1

Le uniche variabili che possono essere espressi in un tipo di oggetto sono quelle che sono istanza di classe. Questo esclude il tipo di base come int, boolean, double. Questi devono essere trasformati, rispettivamente, nel tipo: Integer, Boolean, Double.

Problemi correlati