![](/img/trans.png)
[英]Java Bounded Generics: Type inference bug? (Method invocation, JLS 15.12.2.7)
[英]Java/Scala Bounded Generics and type inference mismatch
來自Java背景,我知道這不會編譯。
public static class SuperClass {}
public static class SubClass extends SuperClass {}
public static <T, U extends T> U returnSub(T sup, U sub) {
return sub;
}
public static void main(String[] args) {
SuperClass parent = new SuperClass();
SubClass child = new SubClass();
returnSub(parent, child);
returnSub(child, parent); // Java doesn't like that
}
最后一行產生編譯器錯誤(編輯:至少在jdk1.6.0_65上),它確實:
綁定不匹配:類型Test的泛型方法returnSub(T,U)不適用於參數(Test.SubClass,Test.SuperClass)。 推斷類型Test.SuperClass不是有界參數的有效替代
所以,我很驚訝,這似乎在Scala中起作用。 我在下面編寫了示例代碼(據我所知,表達了相同的“邏輯”):
class SuperClass
class SubClass extends SuperClass
def returnSub[Type, SubType <: Type](supArg: Type, subArg: SubType): SubType = {
subArg
}
override def main(args: Array[String]): Unit = {
val parent = new SuperClass()
val child = new SubClass()
val iAmOkWithThat: SubClass = returnSub(parent, child)
val iDontGetThat: SuperClass = returnSub(child, parent)
}
我猜 Scala編譯器很聰明,可以說“好吧, child
是SubClass
一個實例,但是如果我這么說我就不能調用returnSub
,所以如果我把child
視為一個SuperClass
實例,讓我試試吧,好吧,它工作,所以讓我們這樣做“。
這是發生了什么(如果是這樣,你能指出一個語言規范)嗎? 或者我的Scala“轉換”可能不等同於我的Java代碼?
謝謝!
您的代碼應該適用於這兩種語言,因為T
和U
都可以是SuperClass
。 使用Java 1.8,您的代碼可以毫無問題地編譯。 自從引入泛型以來,類型推斷已經有了很大的改進,但是你可以通過編寫從1.5開始在所有版本的Java上使用它
ThisClass.<SuperClass, SuperClass>returnSub(child, parent);
你現在需要提供這樣的顯式類型參數。
至於為什么你沒有得到與Scala相同的問題,我恐怕無法回答,因為我根本不了解Scala。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.