我有以下層次的問題階:斯卡拉泛型和繼承
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
}
編譯器似乎並不能夠泛型參數綁定在調用getValue函數 - 我認爲它應該能夠從Subclass的定義中推斷出來。編譯錯誤如下:
推斷類型參數[沒什麼,子類]不符合方法GetValue的類型參數界限[A,B <:摘要[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();
}
}
我是很新,斯卡拉所以可能有一些細微之處,我很想念。
在此先感謝您的幫助!
也可以與'乙<%摘要[A]'通用參數使用隱式圖。我認爲這可能會被棄用,但它產生的暗含的論證是類型推斷的充分證據。 –
很好的答案。我確實考慮了隱含的論證方法,但沒有看到原始原因不起作用的充分理由。使用<%查看邊界肯定已被棄用。 – paulyb