gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 15:37:44 25 4
gpt4 key购买 nike

最近我开始注意到我的一些代码中有重复。当然,一旦你注意到重复,它就会变得刺耳。这就是我问这个问题的原因。

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

我认为我的意思是一个很好的术语是“反射(reflection)类”。您创建一个转换,它接受一个类,并返回一个以期望方式修改的类。同步是最简单的情况,但还有其他情况:使类不可变[包装方法以便它们克隆,变异克隆,并将其包含在结果中],使类只读[假设您可以识别变异方法],创建类似乎适用于 A 型而不是 B 型等。

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

我只是想知道这是否已经用一种语言实现了,它叫什么。

最佳答案

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

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

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

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

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

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

也许看看这些论文(我还没有全部阅读,但我打算):
  • Generic Wrappers
  • Featherweight wrap java
  • Type-safe delegation for Java
  • JavaGI
  • Statically scoped object adaptation with expanders
  • Uniform Proxies for Java

  • 对于最后一个,摘要说:

    We discuss the precise benefits and costs of our extension in terms of the criteria introduced, and illustrate the usefulness of uniformly available proxies by implementing future method invocations both safely and transparently.



    ,这是您的问题之一。

    很酷的问题顺便说一句,我希望你的问题有一个通用的解决方案。我不假装是这方面的专家,所以甚至可能有一个,但我不知道。

    关于types - 这个概念是否有一个术语,它是否存在于静态类型语言中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2824313/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com