Scala 非子类型的模糊隐式解决方案

Scala 非子类型的模糊隐式解决方案,scala,functional-dependencies,implicits,Scala,Functional Dependencies,Implicits,如果运行下面的代码,将出现不明确的隐式错误: class Foo[T,I](val msg:I) 对象Foo{ 隐式定义提供[T]:Foo[T,字符串]= new Foo(“我来自一个你无法触摸的地方,所以子类型无法帮助你”) } 类用户 对象用户{ 隐式对象userFoo扩展Foo[User,Int](42) } def fooOf[T,I](U:T)(隐式foo:foo[T,I]):foo[T,I]=foo fooOf(新用户)。msg//epic失败: //错误:(232,7)不明确的隐式

如果运行下面的代码,将出现
不明确的隐式
错误:

class Foo[T,I](val msg:I)
对象Foo{
隐式定义提供[T]:Foo[T,字符串]=
new Foo(“我来自一个你无法触摸的地方,所以子类型无法帮助你”)
}
类用户
对象用户{
隐式对象userFoo扩展Foo[User,Int](42)
}
def fooOf[T,I](U:T)(隐式foo:foo[T,I]):foo[T,I]=foo
fooOf(新用户)。msg//epic失败:
//错误:(232,7)不明确的隐式值:
//类型为$A153.this.User.userFoo.type的对象用户中的两个对象userFoo
//和方法在类型为[T]=>A$A153的对象Foo中提供。this.Foo[T,String]
//匹配预期类型A$A153.this.Foo[A$A153.this.User,I]
//fooOf(新用户).msg//
//^
通常Scala将
T
类型的伴生对象置于
F[T,I]
中,优先于
F[\u]
。但在这种情况下不是这样,因为两个定义位置的类型
I
不同。(如果它们都是
String
,Scala将在
User
伴生对象中选择
Foo[User,String]


我不能(或者更好地说不想)触摸
Foo
伴生对象来实现
LowerPriorityImplicits
子类型技术,并在更高优先级上定义
F[User,I]
实例。我还能做什么?

我找到了一个解决方案,它允许函数
fooOf
只显式地查找伴随对象:

密封的特征级
case对象傻瓜级别扩展ILevel
案例对象CompanionLevel扩展了ILevel
抽象类Foo[T,I](val msg:I){

你看了类型级别了吗?多亏了你,我现在正在看