类型类和包对象的奇怪的隐式解析行为

黄素

我试图为类型类列表提供不同的实现集,其中导入不同的包对象将使最终用户将不同版本的TypeClass实现引入作用域,而交换是完全不可见的。

trait TypeClass[T] {
  def name: String
}


trait DefaultTypeClasses {
  implicit val String: TypeClass[String]
  implicit val Int: TypeClass[Int]
}

trait FirstImplementor extends DefaultTypeClasses {
  implicit object String extends TypeClass[String] {
    def name = "test"
  }

  implicit object Int extends TypeClass[Int] {
    def name = "int"
  }
}

object FirstImplementor extends FirstImplementor


object Test {

  import FirstImplementor._

  def doSomething[T : TypeClass](value: T): Unit = {
    println(implicitly[TypeClass[T]].name)
  }

  doSomething("test")

}

上面的方法按预期工作,但如果这样做:

trait DefaultDefinitions extends DefaultTypeClasses {
}
package object something extends DefaultDefinitions with FirstImplementor {}

然后将其导入对象package object的范围Test,如下所示:

import com.blabla.something._ // should bring all type class definitions from FirstImplementor into scope.

object Test {

  def doSomething[T : TypeClass](value: T): Unit = {
    println(implicitly[TypeClass[T]].name)
  }

  doSomething("test")// Cannot find implicit value for TypeClass[String]
  doSomething[String]("test")(String) // if passed explicitly it compiles as expected, no more imports necessary.
}

无论出于何种原因,物化类型类在名称的显式作用域中可用,但在隐式作用域中不可用。听起来我对SLS的了解有差距,请问任何人可以澄清一下吗?

尤金·朱列涅夫

但是,如果您在包中创建Implicits对象,则可以正常工作。但是我不知道原始错误是scalac中的错误还是正确的行为

package object something  {
  object Implicits extends DefaultDefinitions with FirstImplementor
}

import something.Implicits._

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

案例类的隐式解析和伴随对象

来自分类Dev

类型类解析中的隐式类别

来自分类Dev

php在隐式转换中的奇怪行为

来自分类Dev

Scala-抽象类型和隐式参数解析

来自分类Dev

define_method和对象类:奇怪的行为

来自分类Dev

隐式类型和通配符

来自分类Dev

无符号和较大符号类型之间隐式转换的不一致行为

来自分类Dev

在泛型类隐式类型参数

来自分类Dev

从隐式类中删除类型

来自分类Dev

无法隐式转换类型Abstract类

来自分类Dev

scala 类型类隐式歧义

来自分类Dev

隐式转换泛型类型对象

来自分类Dev

C ++实例化“隐式”类对象

来自分类Dev

在没有隐式证据对象的情况下直接使用Scala类型类

来自分类Dev

在没有隐式证据对象的情况下直接使用Scala类型类

来自分类Dev

显式和隐式段落的奇怪性

来自分类Dev

隐式参数和类型族

来自分类Dev

类型推断和隐式链接

来自分类Dev

Lambda类型推断和隐式转换

来自分类Dev

隐式参数和通用类型

来自分类Dev

如何为案例类创建一个显式的伴随对象,该对象的行为与替换后的编译器提供的隐式伴随对象相同?

来自分类Dev

类和子类之间的隐式和显式转换

来自分类Dev

在Scala中将参数类型隐式地用于类型类

来自分类Dev

泛型类的子类型的隐式类

来自分类Dev

使用隐式授予类型的Django oauth工具包

来自分类Dev

TypeScript:从对象内容隐式推断通用接口的对象类型

来自分类Dev

如何在包中放置隐式对象?

来自分类Dev

导入与类中方法同名的隐式值时隐式解析失败

来自分类Dev

隐式解析的匿名函数的Scala类型推断