问题标签 [structural-typing]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
scala - 为什么不能优化这种隐式转换的情况?
为什么 Scala 不能优化以下内容:
一个。
至:
湾。
?
为什么在这种情况下必须使用结构类型?我希望 Scala 编译器执行此优化,因为以样式b编写太难看(因为,1. 逻辑的局部性丢失,2. 您必须为这些额外的显式类不必要地发明名称),并且a的性能要差得多比b。
scala - Clojure 协议与 Scala 结构类型
看了Rich Hickey对Clojure 1.2协议的采访,对 Clojure 知之甚少,我有一些关于 Clojure 协议的问题:
- 它们是否打算与Scala中的结构类型做同样的事情?协议相对于结构类型有什么好处(性能、灵活性、代码清晰度等)?它们是通过反射实现的吗?
- 关于与 Scala 互操作性的问题:Scala 中可以使用协议代替结构类型吗?它们可以在 Scala 中扩展(如果“扩展”术语可以应用于协议)吗?
scala - 为什么这种结构类型绑定不能按预期工作?
我正在尝试编写一个简单的辅助方法,它接收可以关闭的东西和接收前者的函数,并确保在执行函数后关闭“可关闭”。
例如,我想像这样使用它:
我的意思是
但是当试图编译这个简单的测试时:
编译器抱怨:
推断的类型参数 [java.io.FileOutputStream] 不符合方法关闭的类型参数边界 [T <: AnyRef{def close: Unit}]
任何想法为什么?
reflection - 如何在 isInstanceOf 调用中使用结构类型?
标题基本上是这样说的。
有没有办法new Object {def foo = "bar"}
在isInstanceOf[<structural_type_here>]
通话中使用 eg 的类型?
java - 为什么必须在 Java 中声明接口?
有时我们有几个类,它们的某些方法具有相同的签名,但不对应于已声明的 Java 接口。例如,JTextField
和JButton
(以及 中的其他几个 javax.swing.*
)都有一个方法
现在,假设我希望对具有该方法的对象做一些事情;然后,我想要一个接口(或者自己定义它),例如
这样我就可以写:
但是,可悲的是,我不能:
这种演员阵容是非法的。编译器知道这JButton
不是a CanAddActionListener
,因为该类尚未声明实现该接口......但是它“实际上”实现了它。
这有时会带来不便——Java 本身已经修改了几个核心类来实现由旧方法(String implements CharSequence
例如 )组成的新接口。
我的问题是:为什么会这样?我理解声明一个类实现一个接口的实用性。但是无论如何,看看我的例子,为什么编译器不能推断出类JButton
“满足”接口声明(查看它的内部)并接受强制转换?是编译器效率的问题还是有更根本的问题?
我对答案的总结:在这种情况下,Java 可以允许一些“结构类型”(有点像鸭子类型 - 但在编译时检查)。它没有。除了一些(对我来说不清楚)性能和实现方面的困难之外,这里还有一个更基本的概念:在 Java 中,接口(通常是所有东西)的声明不仅仅是结构性的(具有这些签名)但语义:这些方法应该实现一些特定的行为/意图。因此,在结构上满足某些接口的类(即,它具有具有所需签名的方法)不一定在语义上满足它(一个极端的例子:回想一下“标记接口”,它甚至没有方法!)。因此,Java 可以断言一个类实现了一个接口,因为(并且仅仅是因为)它已被显式声明。其他语言(Go、Scala)有其他的哲学。
scala - 如何在仅接受子类的 scala 中进行结构输入?
与其用语言描述问题,不如让我向您展示一个 Scala Interpreter 会话,它显示了我想要做什么。
所以基本上我想在一个参数中定义一个类型,它既是某种类型的子类,又包含一个带有签名的方法 def name():String
。
注意:我正在尝试这样做,因为我的类层次结构已经很复杂了。鉴于此,我宁愿不添加 aParentWithName
abstract class
或者trait
是否可以避免。
c# - 接受具有共同属性的多个对象的 C# 方法?
我有几个对象,它们具有一些共同的属性。例如:
对象 A 属于 X 类型,它有 10 个属性
对象 B 的类型为 Y,它有 15 个属性
对象 C 是 Z 类型,它有 7 个属性
所有这些对象都具有共同的“名称”、“签名”和“校验和”属性。我正在尝试创建一个静态辅助方法,它可以接受包含“名称”、“签名”和“校验和”属性的任何类型的对象。这是可能的还是我实际上需要三种不同的方法(一个接受每种类型的对象)?
编辑 - 对于它的价值,我没有提到这些对象是通过 Web 服务向我公开的。
scala - 为什么scala使用反射来调用结构类型的方法?
如果函数接受结构类型,则可以定义为:
或者
然后,您可以通过以下方式使用该功能:
如果您对我的示例中由 scalac 生成的类进行反编译(到 Java),您可以看到参数doTheThings
是类型Object
的,并且实现使用反射来调用参数上的方法(即duck.quack
)
我的问题是为什么要反思?难道不能只使用匿名和调用虚拟而不是反射吗?
这是为我的示例翻译(实现)结构类型调用的方法(Java 语法,但重点是字节码):