2013-04-08 16 views
6

Problem dotyczy integracji między Javą i Scala. Uprościłem to nieco, aby wszystko było bardziej zrozumiałe.nie może domyślnie rzutować A [T] na AT, gdzie A [T] rozciąga się pod numerem

Mam dwie klasy napisany w Javie:

class A<T>{} 

class AT extends A<Boolean> {} 

W Javie Mam metoda, która używa klasy w następujący sposób:

public A<Boolean> a(){ 
    return new AT(); 
} 

chciałbym zrobić to samo w scala. Ale poniższy kod nie kompiluje się.

def a(): A[Boolean] = { 
    return new AT(); 
} 

Komunikat mówi: "rodzaj niedopasowania; znaleziono: org.rarry.sample.AT wymagane: org.rarry.sample.A [Boolean]"

Czy ktoś może wyjaśnić, dlaczego tak jest, a jak to zrobić?

Odpowiedz

5

Aby zrozumieć przyczynę, dla której Twój kod się nie kompiluje, najpierw zauważ, że Java używa java.lang.Boolean dla pudełkowego typu boolowskiego, a Scala używa scala.Boolean. W większości przypadków, gdy chcesz użyć jednego z nich, a metoda zwraca drugą (lub argument metody wymaga drugiej), zostanie wykonana niejawna konwersja, a użyty zostanie odpowiedni typ.

Metoda a, którą napisałeś w Scala naprawdę zwraca A[java.lang.Boolean]. Ponieważ nie ma żadnej niejawnej konwersji między A[java.lang.Boolean] i A[scala.Boolean], w tym przypadku nie zostanie automatycznie zwrócona A[scala.Boolean].

Aby sprawdzić, czy jest to przypadek, możemy zauważyć, że metoda ta kompiluje bez problemów:

def a: A[java.lang.Boolean] = new AT() 

powtórzyć punkt, ponieważ nie mają niejawna konwersja, to również nie działa (zobaczysz, jak to może być ustalona poniżej):

val instanceOfA: A[Boolean] = a 
def a = new AT() 
// Error: AT doesn't conform to A[Boolean] 

aby to naprawić, można niejawnie przekonwertować do potrzebnego typu oddając go:

implicit def toScalaABoolean(a: A[java.lang.Boolean]): A[Boolean] = 
     a.asInstanceOf[A[Boolean]] 

Z tego zrobić, nawet nie trzeba zadeklarować typ zwracanej a metody już:

implicit def toDifferentBoolean(a: A[java.lang.Boolean]): A[Boolean] = 
    a.asInstanceOf[A[Boolean]] 
val instanceOfA: A[Boolean] = a 
def a = new AT() 
Powiązane problemy