【问题标题】:Implicits and type definitions隐式和类型定义
【发布时间】:2014-04-02 00:23:56
【问题描述】:

我对 scala 很陌生,并且在隐式概念上苦苦挣扎。

我有一个定义如下的类:

class SomeClass[A <: AA, B <: BB](val someParameter: String)

我想将这个类与不继承自 AA 和 BB 的其他类型一起使用,如下所示:

val myInstanceOfSomeClass = SomeClass[C, D]

知道 C 和 D(它们是 Java 类,如果有帮助的话)可以通过它们的构造函数转换为 AA 和 BB 实例

def myAInstance(someCValue : C) : A = new A(someCValue)

myInstanceOfSomeClass 在另一个函数中用作 SomeClass[C, D] 类型的参数。

我知道这与隐式定义有关,但我对语法很迷茫,尤其是我应该在哪里以及如何定义隐式定义...

那么,我如何将 SomeClass 与可以转换为定义类型的其他类型一起使用?

编辑我无法直接修改SomeClass[A &lt;: AA, B &lt;: BB] 的定义,因为它来自外部库。

【问题讨论】:

    标签: scala


    【解决方案1】:

    有一个相关的类型绑定,称为“视图绑定”,用&lt;% 表示,它通过包含文字子类型以及在使用时可以进行隐式转换的子类型来放松&lt;: 约束。

    所以您需要做的就是将您的SomeClass 更改为:

    class SomeClass[A <% AA, B <% BB](val someParameter: String)
    

    …当然,还要确保 implicit 转换在您想使用该类的地方可用。这意味着您需要在转换中使用 implicit 关键字:

    implicit def myAInstance(someCValue : C) : A = new A(someCValue)
    

    【讨论】:

    • 很抱歉,我的帖子并不清楚,但我无法更改 class SomeClass[A &lt;: AA, B &lt;: BB](val someParameter: String) 的定义。这就是我所说的“我想以这种方式使用课程:val myInstanceOfSomeClass = SomeClass[C, D]。我正在编辑问题。
    • 那么你运气不好,必须显式应用转换(当然不必是implicit)。
    • 嗯...我想我可以做到...无论如何,谢谢!但是我应该接受你的回答吗?
    • 嗯,这不是您真正想要的答案,所以我不得不说不。如果您觉得大方,也许是一个简单的投票。
    • 我很乐意,但我需要 15 个声望点...不过还是谢谢 :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-15
    相关资源
    最近更新 更多