我想从包装类的外部实例化一个内部的非静态接口。
这可能吗?
考虑以下代码:
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
对象,仅适用于新创建的对象。看到这允许访问对象的私有值,这似乎是一件好事。