2017-07-27 102 views
5

我想從包裝類外部實例化一個內部非靜態接口。實現內部非靜態接口

這可能嗎?

考慮下面的代碼:

shared class AOuterClass() { 
Integer val = 3; 
shared interface AInterface { 
     shared Integer val => outer.val; 
    } 
} 

void test() { 
    AOuterClass o = AOuterClass(); 
    object impl satisfies ???.AInterface{} 
} 

我覺得object impl satisfies o.AInterface{}將是我的直覺合理,但是編譯器不允許它。

回答

6

在像你這樣的情況下是不可能的。

錫蘭規範說(section 4.5.4 Class Inheritance):

嵌套類的子類必須聲明嵌套類或聲明嵌套類的類型的子類型的類型的成員。滿足嵌套接口的類必須是聲明嵌​​套接口的類型的成員或聲明嵌套接口的類型的子類型的成員。

所以你只能滿足聲明類或其子類中的嵌套接口。用新界面擴展一個嵌套的界面也有類似的語言。

這並不直接提到object聲明,但這些僅僅是類定義的快捷方式,作爲稍後闡述,在Anonymous classes

以下聲明:

shared my object red extends Color('FF0000') { 
    string => "Red"; 
} 

是完全相同相當於:

shared final class \Ired of red extends Color { 
    shared new red extends Color('FF0000') {} 
    string => "Red"; 
} 

shared my \Ired red => \Ired.red; 

其中\Ired是由編譯器分配的類型名稱。

因此,這也包括object聲明作爲你的一個。

你也許能做什麼(我沒有測試這一點):

AOuterClass.AInterface test(){ 
    object o extends AOuterClass() { 
     shared object impl satisfies AInterface{} 
    } 
    return o.impl; 
} 

當然,這並不能爲現有AOuterClass對象的工作,只爲新創建的一個。看到這允許訪問一個對象的私有價值,這似乎是一件好事。

+0

我同意,這是最簡單的解決方案。 (是的,它工作。) –

+0

這個想法是創建和實現給定'o'的外部接口。 (但這也只是一個想法,並不重要,我只是想知道我是否有一些語法技巧) –