这个概念是否有一个术语,它是否以静态类型语言存在?

Cra*_*ney 6 theory types naming

最近我开始注意到我的一些代码中的重复.当然,一旦你注意到重复,它就变成了光栅.这就是我问这个问题的原因.

这个想法是这样的:有时你会编写同一个类的不同版本:原始版本,锁定版本,只读外观版本等.这些是一类常见的事情,但翻译是高度机械的.使用锁获取/释放等环绕所有方法.在动态语言中,您可以编写一个函数来对类的实例执行此操作(例如,迭代所有函数,将其替换为获取/释放a的版本)锁.).

对于我的意思,我认为一个好的术语是"反映阶级".您创建一个转换,它接受一个类,并返回一个修改后的所需方法类.同步是最简单的情况,但还有其他:使类不可变[包装方法,以便克隆,改变克隆,并将其包含在结果中],使类只读[假设您可以识别变异方法],制作类似乎使用类型A而不是类型B等.

重要的是,从理论上讲,这些转换在编译时是有意义的.尽管ActorModel <T>具有根据T而改变的方法,但它们在编译时以特定方式依赖于T(ActorModel <T>方法将返回原始结果类型的未来).

我只是想知道这是用语言实现的,以及它的名称.

ewe*_*nli 2

如果我理解得很好,您希望能够通过现有类型的转换来生成新的类/类型。就像是

class Synchronized<T> {
    Object invocation( Object ... args ) {
        synchronize( this ) {
            return original.invocation( args );
        } 
    }
}
...
Foo f;
Synchronized<Foo> f2;
f.bar();
f2.bar(); // would be valid for the type-system
Run Code Online (Sandbox Code Playgroud)

,其中invocationoriginal将是这个新颖抽象的关键字。

新类型可以看作是原始类型的代理/包装器/适配器。新类型是否仍然代表原始类型的子类型是另一个问题。抽象在多大程度上支持更改返回类型也是另一个问题。

虽然字节码检测、AOP 或自定义类加载器可以实现部分目的,但我想说,本质上最接近的匹配是动态代理。动态代理的代码看起来确实很糟糕,与我上面写的类似。这里这里这里是我用动态代理解决的情况。当然,动态代理不是静态的,而是顾名思义,是动态的。

我担心您描述的一般问题(如何创建现有类型的变体)过于宽泛。针对具体情况提出了类型系统扩展的建议,例如如何创建一个从接口X到Y的适配器,使得X的所有具体实现也可以被视为Y的实现。

也许看看这些论文(我还没有全部读完,但我打算读一下):

对于最后一项,摘要说:

我们根据引入的标准讨论了扩展的确切好处和成本,并通过安全和透明地实现未来的方法调用来说明统一可用代理的有用性。

,这是你的问题之一。

顺便说一句,很酷的问题,我希望存在一个解决您问题的通用解决方案。我并不假装自己是该领域的专家,所以甚至可能有一个专家,但我不知道。