问题标签 [return-current-type]

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 回答
1256 浏览

scala - 从没有运行时强制转换的通用函数返回案例类的副本

我想摆脱运行时强制转换为泛型 ( asInstanceOf[A]) 而不进行隐式转换。

当我有一个由具有共同特征的案例类组成的相当干净的数据模型并希望在其上实现通用算法时,就会发生这种情况。例如,生成的算法应该采用一个类型的类,A它是 的子类,trait T并且应该返回A具有一些更新字段的具体类的副本。

copy当我可以简单地向基本特征添加一个抽象方法并在所有子类中实现它时,这很容易实现。但是,这可能会使用某些算法所需的方法污染模型,并且有时是不可能的,因为模型可能超出我的控制范围。

这是一个简化的示例,用于演示问题和使用运行时强制转换的解决方案。

请不要纠结于细节。

假设有一个特征和一些我无法更改的案例类:

percentOfCompany并且这里有一个简单的方法,当总股数发生变化时重新计算当前并更新案例类中的字段

REPL 上的一些示例调用:

所以它可以工作,据我所知,.asInstanceOf[A]调用永远不会失败,但需要编译代码。有没有办法在没有隐式转换的情况下以类型安全的方式避免运行时强制转换?

0 投票
4 回答
808 浏览

scala - Scala:在父方法中维护子类?

当你有父母时:

我想

updatedChild是类型Child而不是类型Parent,这可能吗?

0 投票
1 回答
132 浏览

scala - 如何让特征在scala中使用`this`构造函数?

[编辑更新] 这是对我的问题的正确陈述。

我希望在 a 中调用构造函数trait。但似乎我必须使用apply功能。它是否存在像 new this() 这样的用法?

就像下面的代码。它抛出类型不匹配。我希望添加构造函数的约束,或者我必须使用apply函数。

0 投票
3 回答
904 浏览

scala - 对于返回电流类型问题,F 有界多态性相对于类型类的优势

在 StackOverflow 上经常会问到返回当前类型的问题。是一个这样的例子。通常的答案似乎是F 有界多态性类型类模式解决方案。Odersky 在Is F-bound polymorphism 有用吗?

F-bounds 确实增加了显着的复杂性。我希望能够摆脱它们,并用更高级的子类型替换它们

而 tpolecat (链接帖子的作者)建议

一个更好的策略是使用类型类,它可以巧妙地解决问题并且几乎没有担心的余地。事实上,在这些情况下完全放弃亚型多态性是值得考虑的。

确定了以下缺点

F-bounded polymorphism 将一个类型参数化为它自己的子类型,这是一个比用户通常想要的更弱的约束,这是一种说“我的类型”的方式,你不能通过子类型精确地表达它。然而类型类可以直接表达这个想法,所以这就是我要教初学者的

我的问题是,根据上述建议,有人可以证明 F 有界多态性是有利的情况,还是我们应该将类型类解决方案作为解决返回电流类型问题的规范答案?

类型参数的 F 绑定多态性

类型成员的 F 有界多态性

类型类

0 投票
2 回答
55 浏览

scala - 在运行时创建具有相同内部内容的对象

我正在执行创建具有相同内部内容的对象的重复任务,因此我想创建一个通用方法来帮助我实现这一目标。

内部对象如下

我有一个基本特征如下

有几个类扩展了这个特性

我试图编写的用于创建对象的通用方法

但是,在尝试这样做时,我收到一个编译时错误,说

你能告诉我我在这个方法实现中缺少什么吗?注意:- 这是我在代码中尝试做的一个非常简单的实现。

0 投票
3 回答
108 浏览

scala - 类型稳定参数多态性

我不明白为什么以下 scala 代码无法编译:

它可以替换f

然后在f调用时转换为子类型asInstanceOf,例如使用 . 但是我希望能够构造一个函数来统一一些以前定义的方法,并让它们是类型稳定的。谁能解释一下?

另外,请注意以下内容f也可以编译: