Mam problem z następującą hierarchią w Scala:rodzajowych Scala i dziedziczenie
class ScalaGenericTest {
def getValue[A, B <: Abstract[A]](clazz: B): A = clazz.a
def call: String = {
val sub: Subclass = new Subclass
getValue(sub)
}
}
class Subclass extends Abstract[String] {
def a: String = "STRING"
}
abstract class Abstract[A] {
def a: A
}
Kompilator nie wydają się być zdolne do wiązania rodzajowego parametr a w wywołaniu funkcji getValue - I sądzę, że powinien być w stanie wywnioskować to z definicji Subklasy. Błąd kompilacji jest następujący:
wywnioskować argumentów typu [Nic Podklasa] nie są zgodne z granicami parametru Typ Metoda getValue w [A, B <: Streszczenie [A]]
To działa, jeśli I jawnie przekazać ogólnych typów argumentów metody, tj. getValue[String,Subclass](sub)
, ale na pewno kompilator powinien móc wywnioskować to?
tej samej hierarchii działa dobrze w Javie:
public class JavaGenericTest {
public <T,U extends Abstract<T>> T getValue(U subclass) {
return subclass.getT();
}
public String call(){
Subclass sub = new Subclass();
return getValue(sub);
}
private static class Subclass extends Abstract<String> {
String getT(){
return "STRING";
}
}
private static abstract class Abstract<T> {
abstract T getT();
}
}
Jestem całkiem nowy Scala więc pewnie niektórzy subtelność, że mi brakuje.
Z góry dziękuję za pomoc!
Można również użyć niejawny widok od parametru rodzajowego z 'B <% Streszczenie [A]'. Myślę, że może to być przestarzałe, ale ukryty argument, jaki on tworzy, jest wystarczającym dowodem na wnioskowanie o typie. –
Świetna odpowiedź. Wziąłem pod uwagę domyślne podejście do argumentów, ale nie widziałem dobrego powodu, dla którego oryginał nie działał. Zobacz ograniczenia przy użyciu <% zdecydowanie zostały wycofane. – paulyb