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

typ rozbieżności: znaleziono Int(42) wymagana: AnyRefmetody odziedziczone obiektu są renderowane niejednoznaczne

Uwaga: niejawna istnieje od scala.Int => java.lang.Integer, ale metody odziedziczone Object świadczone są niejednoznaczne. Ma to na celu niedopuszczenie do tego, aby każdy element scala.Int był konwertowany na dowolny AnyRef.

Możesz chcieć użyć typu przypisanie: x: java.lang.Integer

ja nie rozumiem podkreślił rolę. Jakie metody są niejednoznaczne i dlaczego? Czy metody dziedziczone z Object zawsze są "niejednoznaczne" w Scali? Czy jest to specjalny scenariusz, w którym metody w jakiś sposób kończą się w typie? Po prostu nie widzę, skąd bierze się niejednoznaczność.

Odpowiedz

2

Scala musi udawać, że Int znajduje się w innym miejscu w hierarchii dziedziczenia niż Java umieszcza ją. To powoduje pewną niezręczność.

Rozważmy metodę notify. Oczekiwanie na Int nie działa - jest prymitywne. Oczekiwanie na nowo-pudełkowy java.lang.Integer również nie działa, ponieważ inne wątki mogły zostać zakończone własnymi osobno-boxed Integer s. Po prostu nie chcesz, aby notify pracował nad Int - to nie jest dobra rzecz.

Ale jeśli masz konwersję Int => java.lang.Integer bez niczego niezwykłego, to będzie móc wywołać notify na Int.

Aby zapobiec temu typowemu błędnemu zachowaniu, mechanizm nieudanego rozwiązania konwersji spowodowany niejednoznacznością jest przejęty. Dzięki temu Int => java.lang.Integer służy do konwertowania Int, gdzie oczekiwano , gdzie oczekiwano (co złamałoby hierarchię dziedziczenia), i uniemożliwiłoby działanie takich rzeczy, jak 42.notifyAll, pomimo tego, że java.lang.Integer ma tę metodę, mechanizm inferencyjny nie jest zauważany.

Wyświetlona wiadomość dotyczy zarówno przypadku 42.notify, jak i przypadku 42: AnyRef.

+0

Czy możesz rozwinąć temat "mechanizm przejmowania konwersji z powodu niejednoznaczności jest przejęty"? Tego właśnie nie rozumiem. – fredoverflow

Powiązane problemy