2014-04-16 13 views
5
val x: AnyRef = 42 

tipo non corrispondente: trovati Int(42) richiesto: AnyRefmetodi ereditati da Object sono resi ambigui

Nota: un implicito esiste da scala.Int => java.lang.Integer, ma metodi ereditati da Object sono resi ambigui. Questo per evitare impliciti generici che convertono qualsiasi scala.Int in qualsiasi AnyRef.

Si potrebbe desiderare di utilizzare un tipo di attribuzione: x: java.lang.Integer

Non capisco la parte sottolineata. Quali metodi sono resi ambigui e come mai? I metodi ereditati da Object sono sempre "resi ambigui" in Scala? È questo uno scenario speciale in cui i metodi in qualche modo finiscono più volte in un tipo? Non vedo da dove viene l'ambiguità.

risposta

2

Scala deve fingere che Int si trovi in ​​una posizione diversa nella gerarchia dell'ereditarietà rispetto a Java. Ciò si traduce in qualche imbarazzo.

Prendere in considerazione il metodo notify. L'attesa su un Int non funziona: è un primitivo. L'attesa su un nuovo java.lang.Integer non funziona, dal momento che gli altri thread potrebbero aver finito con i propri box Integer separati. Semplicemente non vuoi che notify funzioni su un Int - è la cosa sbagliata da fare.

Ma se avete la conversione Int => java.lang.Integer senza nulla di insolito, è sarà in grado di chiamare notify sul Int.

Per evitare questo tipo di comportamento di solito sbagliato, il meccanismo per non riuscire a risolvere una conversione a causa di ambiguità viene dirottato. Ciò mantiene Int => java.lang.Integer10 per cui è previsto AnyRef (che interromperà la gerarchia di ereditarietà) e impedisce che cose come 42.notifyAll funzionino poiché anche il metodo java.lang.Integer non viene rilevato dal meccanismo di inferenza.

Il messaggio che si vede deve coprire sia il caso 42.notify che il caso 42: AnyRef.

+0

È possibile espandere "il meccanismo per il mancato ripristino di una conversione a causa dell'ambiguità viene dirottato"? Questo è esattamente ciò che non capisco. – fredoverflow

Problemi correlati