问题标签 [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.

0 投票
2 回答
286 浏览

scala - 为什么不能优化这种隐式转换的情况?

为什么 Scala 不能优化以下内容:

一个。

至:

湾。

?

为什么在这种情况下必须使用结构类型?我希望 Scala 编译器执行此优化,因为以样式b编写太难看(因为,1. 逻辑的局部性丢失,2. 您必须为这些额外的显式类不必要地发明名称),并且a的性能要差得多比b

0 投票
4 回答
2396 浏览

scala - Clojure 协议与 Scala 结构类型

看了Rich Hickey对Clojure 1.2协议的采访,对 Clojure 知之甚少,我有一些关于 Clojure 协议的问题:

  • 它们是否打算与Scala中的结构类型做同样的事情?协议相对于结构类型有什么好处(性能、灵活性、代码清晰度等)?它们是通过反射实现的吗?
  • 关于与 Scala 互操作性的问题:Scala 中可以使用协议代替结构类型吗?它们可以在 Scala 中扩展(如果“扩展”术语可以应用于协议)吗?
0 投票
2 回答
556 浏览

scala - 为什么这种结构类型绑定不能按预期工作?

我正在尝试编写一个简单的辅助方法,它接收可以关闭的东西和接收前者的函数,并确保在执行函数后关闭“可关闭”。

例如,我想像这样使用它:

我的意思是

但是当试图编译这个简单的测试时:

编译器抱怨:

推断的类型参数 [java.io.FileOutputStream] 不符合方法关闭的类型参数边界 [T <: AnyRef{def close: Unit}]

任何想法为什么?

0 投票
2 回答
283 浏览

reflection - 如何在 isInstanceOf 调用中使用结构类型?

标题基本上是这样说的。

有没有办法new Object {def foo = "bar"}isInstanceOf[<structural_type_here>]通话中使用 eg 的类型?

0 投票
6 回答
773 浏览

java - 为什么必须在 Java 中声明接口?

有时我们有几个类,它们的某些方法具有相同的签名,但不对应于已声明的 Java 接口。例如,JTextFieldJButton(以及 中的其他几个 javax.swing.*)都有一个方法

现在,假设我希望对具有该方法的对象做一些事情;然后,我想要一个接口(或者自己定义它),例如

这样我就可以写:

但是,可悲的是,我不能:

这种演员阵容是非法的。编译器知道JButton 不是a CanAddActionListener,因为该类尚未声明实现该接口......但是它“实际上”实现了它

这有时会带来不便——Java 本身已经修改了几个核心类来实现由旧方法(String implements CharSequence例如 )组成的新接口。

我的问题是:为什么会这样?我理解声明一个类实现一个接口的实用性。但是无论如何,看看我的例子,为什么编译器不能推断出类JButton“满足”接口声明(查看它的内部)并接受强制转换?是编译器效率的问题还是有更根本的问题?

我对答案的总结:在这种情况下,Java 可以允许一些“结构类型”(有点像鸭子类型 - 但在编译时检查)。它没有。除了一些(对我来说不清楚)性能和实现方面的困难之外,这里还有一个更基本的概念:在 Java 中,接口(通常是所有东西)的声明不仅仅是结构性的(具有这些签名)但语义:这些方法应该实现一些特定的行为/意图。因此,在结构上满足某些接口的类(即,它具有具有所需签名的方法)不一定在语义上满足它(一个极端的例子:回想一下“标记接口”,它甚至没有方法!)。因此,Java 可以断言一个类实现了一个接口,因为(并且仅仅是因为)它已被显式声明。其他语言(Go、Scala)有其他的哲学。

0 投票
1 回答
96 浏览

scala - 在运行时方法类型参数化中提供结构类型?

跟进这个 SO 问题。

假设我有代码

此函数使对象param调用名为foo

[编辑]

我想知道以下是否可能(有或没有反射)

  • param在编译时固定,函数的名称(在这种情况下foo)在运行时提供
  • 两者param和函数的名称foo都是在运行时提供的
  • param在编译时是固定的,函数的名称、函数参数、值和返回类型在运行时提供。

我意识到结构类型已经使用反射。所以我的问题是 Scala 是否可以处理它,或者我是否在我的代码中明确使用了反射。我认为第三个需要反射,我可以使用ASM库。

0 投票
1 回答
241 浏览

scala - 如何在仅接受子类的 scala 中进行结构输入?

与其用语言描述问题,不如让我向您展示一个 Scala Interpreter 会话,它显示了我想要做什么。

所以基本上我想在一个参数中定义一个类型,它既是某种类型的子类,又包含一个带有签名的方法 def name():String

注意:我正在尝试这样做,因为我的类层次结构已经很复杂了。鉴于此,我宁愿不添加 aParentWithName abstract class或者trait是否可以避免。

0 投票
1 回答
291 浏览

scala - 泛型中奇怪的嵌套结构类型

有人可以解释嵌套在泛型中的结构类型的奇怪构造:

这个例子来自 Scalaz 库:Functor.scala

为什么那里需要这种结构?写起来不会更简单:

或者

0 投票
8 回答
4272 浏览

c# - 接受具有共同属性的多个对象的 C# 方法?

我有几个对象,它们具有一些共同的属性。例如:

对象 A 属于 X 类型,它有 10 个属性

对象 B 的类型为 Y,它有 15 个属性

对象 C 是 Z 类型,它有 7 个属性

所有这些对象都具有共同的“名称”、“签名”和“校验和”属性。我正在尝试创建一个静态辅助方法,它可以接受包含“名称”、“签名”和“校验和”属性的任何类型的对象。这是可能的还是我实际上需要三种不同的方法(一个接受每种类型的对象)?

编辑 - 对于它的价值,我没有提到这些对象是通过 Web 服务向我公开的。

0 投票
2 回答
2898 浏览

scala - 为什么scala使用反射来调用结构类型的方法?

如果函数接受结构类型,则可以定义为:

或者

然后,您可以通过以下方式使用该功能:

如果您对我的示例中由 scalac 生成的类进行反编译(到 Java),您可以看到参数doTheThings是类型Object的,并且实现使用反射来调用参数上的方法(即duck.quack

我的问题是为什么要反思?难道不能只使用匿名和调用虚拟而不是反射吗?

这是为我的示例翻译(实现)结构类型调用的方法(Java 语法,但重点是字节码):