我想从包装类的外部实例化一个内部的非静态接口。

这可能吗?

考虑以下代码:



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{}是我的合理直觉,但编译器不允许这样做。

最佳答案

在像您这样的情况下是不可能的。

锡兰规范说(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对象,仅适用于新创建的对象。看到这允许访问对象的私有值,这似乎是一件好事。

07-24 09:38
查看更多