說我有在Java中定義下面的類:轉換
public class A
{
public class B
{
}
public B[] someFunc() {...}
}
,我試圖如下訪問它在斯卡拉:
val array: Array[A#B] = a.someFunc()
編譯器給我以下警告:
* type mismatch;找到:Array [aB] required:Array [A#B]注意:aB <:A#B,但類Array在類型T中不變。您可能希望研究通配符類型,例如`_ <:A#B *
我不知道我應該用來糾正這個錯誤的正確語法。我嘗試使用以下,但它不會編譯:
val array: Array[T <: A#B] = a.someFunc()
但我發現走通過它傳遞給一個函數來克服這個問題:
def test[T <: A#B](array: Array[T]) = ...
test(a.someFunc())
它編譯罰款。
我將如何實現正確的類型分配而不必定義此測試功能?
由於
德
該解決方案的問題是您需要對A對象的特定實例的引用。這並不總是可行的。假設我想定義一個類或一個函數來操作這種類型,當我沒有這樣的實例時。正如我在我原來的問題中所展示的,有一種方法可以通過定義一個函數來實現我想要的。我相信我們只是錯過了正確的語法來做到這一點,而不必定義這個函數。 – user79074
你是對的,你需要一個'A'的實例。真正的問題是路徑依賴類型只是編譯器小說;在運行時,一切都是'A#B'。但是沒有直接的方式告訴編譯器「我知道我在做什麼,這是安全的」,當然除了演員。請參閱編輯。 – gourlaysama
有一些斯卡拉領域肯定是值得的;這(非靜態內部類的實例的路徑依賴類型)似乎是其中之一。 –