muszę zastąpić następującą metodę Javy w klasie Scala:Scala: Zastępowanie Generic Java metoda, która zwraca null
public class Test<T> {
public T test(T o, boolean x) {
if (x) {
return o;
}
return null;
}
}
z następującym podejściu (w Scala), kompilator narzeka: „Wyrażenie typu Null nie jest zgodny z oczekiwanym typu T ":
class Test2[T] extends Test[T] {
override def test(o: T, x: Boolean): T = {
if (x) {
return o
}
return null
}
}
próbowałem również zdefiniować Option[T]
jako wartość zwracana, ale potem znowu, kompilator narzeka, że podpisy metoda nie będzie pasować.
Każdy pomysł? - Dzięki!
Edit:
sugestia Daniela działa na problem jako Cytat; Jednak moja rzeczywisty Problem niestety nadal różni się nieznacznie (o parametr typu rodzajowego w metodzie nie klasy, definicja) (przepraszam):
Java:
public class Test {
public <T> T test(T o, boolean x) {
if (x) {
return o;
}
return null;
}
}
Scala:
class Test2 extends Test {
override def test[T >: Null](o: T, x: Boolean): T = {
if (x) {
return o
}
return null
}
}
Kompilacja ponownie kończy się niepowodzeniem z błędem, "Wyrażenie typu Null nie jest zgodne z oczekiwanym typem T".
(wierzę, że to dlatego, że override
nie obejmuje żadnych możliwości - czyli coś typu Nothing
mogłyby zostać przekazane do Test.test(..)
- Cóż, to może ;-))
Co robi praca jest rzucanie RuntimeException
zamiast wrócić null
jak zasugerował Ricky; niemniej jednak będę wdzięczny za dalsze uwagi.
Dzięki!
To idealne rozwiązanie problemu, który został pierwotnie opublikowany; jednak musiałem się przekonać, że faktyczny problem nieco się różni. - Zaznaczę to jako rozwiązanie, jeśli nie powinno być dokładniejszej odpowiedzi, ale czy mógłbyś jeszcze raz spojrzeć na - teraz edytowane - pytanie. - Dziękuję bardzo. – robbbert
Dzięki, dobrze zrobione. - Oba rozwiązania działają (drugi z użyciem parametru "[T]" jako typu), chociaż jeszcze nie w pełni rozumiem problem ... – robbbert
@robbbert Wyszukaj informacje na temat 'Nothing' i' Null', aby lepiej to zrozumieć . –