您好,登錄后才能下訂單哦!
本篇內容主要講解“Scala重載是什么”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“Scala重載是什么”吧!
如果一個標識符或選擇e引用了數個類的成員,則將使用引用的上下文來推斷唯一的成員。使用的方法將依賴于e是否被用作一個函數。設A是e引用的成員的集合。 首先假定e作為函數出現在應用中,比如e(args)。如果在A中有且僅有一個可選成員是一個(可能是多態)方法類型,其元數與給出的參量數目匹配,則就會選定該可選成員。 否則,設Ts是通過用未定義類型來類型化每個參量所得到的類型向量。首先要確定的是可用的可選成員的集合。如果Ts中每個類型都與對應的可選成員中正式參數類型相似,且如果期望類型已定義,方法的結果類型與之兼容,則該可選項是可用的。對于一個多態方法,如果本地類型推斷可以確定類型參量,則該實例化的方法是可用的,繼而該多態方法也是可用的。 設B是可用的可選項的集合。如果B為空則導致錯誤。否則可以用以下”同樣具體”和”更具體” 的定義來選出在B中最具體的可選項: ? 具有類型(Ts)U的參數化的方法,如果有某些類型為S的其他成員,S對于類型Ts的參量(ps)是可用的,則該方法與這些成員同樣具體。 ? 具有類型[a1 >: L1 <: U1,...,an >: Ln <: Un]T的多態方法,如果有某些類型為S其他成員,如果假定對于i=1,...,n,每個ai都是一個抽象類型命名,其邊界在Li之上且在Ui之下,有T和S同樣具體,則該方法和這些成員同樣具體。 ? 具有其他類型的成員總是與一個參數化的方法或一個多態方法同樣具體。 ? 給定具有類型T和U的兩個沒有參數化也不是多態方法類型的成員,類型為T的成員與類型為U的成員同樣具體的條件是T的雙重存在與U的雙重存在相似。這里多態類型[a1 >: L1 <: U1,...,an >: Ln <: Un]T的雙重存在是T forSome { type a1 >: L1 <: U1,...,type an >: Ln <: Un}。其他類型的雙重存在是類型自身。 如果A與B同樣具體,同時要么B與A不同樣具體,要么A在B的一個子類中定義,則A比B更具體。 如果B中沒有可選項比B中其他可選項更具體則將導致錯誤。 下面假定e以函數的形式在類型應用中出現,比如e[targs]。那么我們將選擇A中所有的與targs中的類型參量具有同樣數目的參數類型的可選項。如果沒有該類可選項將導致錯誤。如果有多個這樣的可選項,則將對整個表達式e[targs]重新應用重載解析。 最后我們假定e沒有在應用或類型應用中做為函數出現。如果給出了期望類型,設B是A中與其兼的該類可選項的集合。否則,設B為A。在此情況下我們在B的所有可選項中選擇最具體的可選項。如果B中沒有可選項比B中其他所有的可選項更具體則將導致錯誤。 在所有情況下,如果最具體的可選項定義在類C中,且有另外一個可應用的可選項定義在C的子類中,則將導致錯誤。 示例6.25.1 考慮以下定義: class A extends B {} def f(x: B, y: B) = ... def f(x: A, y: B) = ... val a: A val b: B 則應用f(b, b)指向f的第一個定義,應用f(a, a)指向第二個。假設我們添加第三個重載定義 def f(x: B, y: A) = ... 則應用f(a, a)將因模糊定義而被拒絕,因為不存在更具體的可應用簽名。 |
到此,相信大家對“Scala重載是什么”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。