2010-12-15 48 views
6

我在這裏有一個庫和一些Java類。一個類有一些protected static方法,我認識到的是一個OOP no-no,但我不能更改它的代碼。假設我有一個Scala類,它是上述Java類的子類,我怎樣才能調用它的受保護靜態成員?從Scala調用受保護的靜態Java方法

+2

是不是一個選項來創建一個調用超類方法的Java子類?然後你可以讓你的Java類可以被Scala訪問。 – Madoc 2010-12-15 00:55:14

+0

啊,是的,我想我可以走這條路。謝謝。似乎有點奇怪,但它不可能直接! – 2010-12-15 00:57:59

+0

也許它可能更直接在Scala中,我不知道。這就是爲什麼我發佈這個評論而不是答案。顯然,「超級」調用不能工作,因爲Scala沒有靜態繼承。也許你可以創建一個擴展有問題的類的Scala對象,然後調用「LibraryClassName.staticMethodName(...)」,從而避免使用「超級」?我不確定這是否可行。 – Madoc 2010-12-15 01:10:15

回答

19

參見Frequently Asked Questions - Java Interoperability

這是Scala中的一個已知的限制: 沒有 '靜態' 成員 Scala中的概念。相反,Scala將Y類的靜態成員看作是單例對象Y(類Y的 伴隨對象)的成員 。 Y類的當 從這個類繼承,可以 只能訪問受保護的成員,但不能訪問受保護的成員對象Y的

有沒有辦法斯卡拉可以模擬 靜而不影響Scala的對象模型的 完整性保護在 的基本方式,所以這是不是 改變。要解決此限制,必須創建一個 帶有Java代碼的封裝類 的實現,該代碼封裝了對受保護的靜態內部類 的所有訪問。

更多 信息和 限制和其解決方法一個具體的例子見ticket #1806

+3

「經常」提問的問題很少提出,很少有人注意到它的存在。 :-) – 2010-12-15 11:04:32

+0

哈哈,確實:) – 2010-12-15 11:17:28

+6

JFYI,這是固定在2.10.0-M2 – OlegYch 2012-03-12 05:50:07