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

4

1 回答 1

6

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

Ceylon 规范说(第 4.5.4 节类继承):

嵌套类的子类必须是声明嵌​​套类的类型或声明嵌套类的类型的子类型的成员。满足嵌套接口的类必须是声明嵌​​套接口的类型或声明嵌套接口的类型的子类型的成员。

因此,您只能在声明类或其子类中满足嵌套接口。类似的语言用于通过新接口扩展嵌套接口。

这并没有直接提到object声明,但它们只是类定义的一种快捷方式,稍后会在匿名类中详细说明:

以下声明:

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

于 2017-07-27T19:05:42.910 回答