簡體   English   中英

Java / Scala有界泛型和類型推斷不匹配

[英]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編譯器很聰明,可以說“好吧, childSubClass一個實例,但是如果我這么說我就不能調用returnSub ,所以如果我把child視為一個SuperClass實例,讓我試試吧,好吧,它工作,所以讓我們這樣做“。

這是發生了什么(如果是這樣,你能指出一個語言規范)嗎? 或者我的Scala“轉換”可能不等同於我的Java代碼?

謝謝!

您的代碼應該適用於這兩種語言,因為TU都可以是SuperClass 使用Java 1.8,您的代碼可以毫無問題地編譯。 自從引入泛型以來,類型推斷已經有了很大的改進,但是你可以通過編寫從1.5開始在所有版本的Java上使用它

ThisClass.<SuperClass, SuperClass>returnSub(child, parent);

你現在需要提供這樣的顯式類型參數。

至於為什么你沒有得到與Scala相同的問題,我恐怕無法回答,因為我根本不了解Scala。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM