У меня проблема со следующей иерархией в scala:
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
}
Компилятор, похоже, не может связывать общий параметр A в вызове функции getValue - я думаю, что он должен иметь возможность сделать это из определения подкласса. Ошибка компиляции выглядит следующим образом:
аргументы inferred type [Nothing, Subclass] не соответствуют методам метода getValue типа [A, B <: Abstract [A]]
Это работает, если я явно передаю аргументы общего типа методу, т.е. getValue[String,Subclass](sub)
, но, безусловно, компилятор должен иметь возможность сделать это?
Такая же иерархия отлично работает в Java:
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();
}
}
Я новичок в Scala, поэтому, возможно, есть некоторые тонкости, которые мне не хватает.
Заранее благодарим за помощь!