2017-04-19 106 views
1

限制對象類型的路徑比方說,我們有以下幾點:在編譯時

interface Container 

package com.one 
class ContainerImplOne extends Container 

package com.two 
class ContainerImplTwo extends Container 

我們有許多實現從集裝箱繼承,但居住在不同的包。如果我們有一個函數,它接受一個容器類型:

def compute(c: Container): Unit 

我們不知道,如果傳入的對象是從包com.one或com.two。有沒有辦法限制計算函數從包二中取出Container實例?換句話說,是否有一種方法可以將類型限制爲com.Two。*?我們可以用Java還是Scala來做到這一點?

+0

@DavisBroda不,它的問題不一樣。這裏的意義不是具體類型的名稱,而是它們從相同的接口繼承而來,函數採用接口的類型。但是這兩個實現都在不同的包中定義。我更新了impl以擁有不同的名稱。 – Mayumi

+0

然後讓它採用containerImplTwo,而不是容器,並且您的問題已解決。如果你只需要一個實現,那麼你爲什麼要使用該接口開始? –

+0

不,有很多Container類型的實現,它可以來自任何包。 – Mayumi

回答

1

您可以(如果你真的,真的,真的需要,如果我見過一個庫,這樣做除了可能在com.one解決已知的錯誤,我會盡量避免不惜一切代價):

def compute(c: Container): Unit = { 
    if (c.getClass.getPackage.getName == "com.two") { 
    ... 
    } else { 
    // do nothing, or throw an exception, etc. 
    } 
} 

您可以修改它以支持在com.two中擴展類的類。

這在運行時失敗,而不是在編譯時,您可以創建一個在編譯時會失敗的宏。

+0

我們最終做到了這一點。 – Mayumi