我尝试创建一个最小的示例,x
不会在下面的代码中编译:
sealed trait Foo
case object FooOne extends Foo
sealed trait Bar[T] {
type foo <: Foo
}
object Bar {
implicit case object BarOne extends Bar[Int] {
type foo = FooOne.type
}
}
case class Quk[B: Bar](b: B)
sealed trait Baz[F <: Foo]
case object BazOne extends Baz[FooOne.type]
case class Bat[B: Bar, F <: Foo](r: Quk[B], z: Baz[F])(implicit ev: Bar[B]#foo =:= F)
object Bat {
val x = Bat(Quk(1), BazOne) // Compilation error here!
}
我得到的错误(在eclipse中)是:
Cannot prove that com.muhuk.Example.Bar[Int]#foo =:= com.muhuk.Example.FooOne.type.
not enough arguments for method apply: (implicit evidence$2: com.muhuk.Example.Bar[Int], implicit ev: =:=[com.muhuk.Example.Bar[Int]#foo,com.muhuk.Example.FooOne.type])com.muhuk.Example.Bat[Int,com.muhuk.Example.FooOne.type] in object Bat. Unspecified value parameter ev.
Foo
并不依赖于任何事情。 Bar
&amp; Baz
Foo
取决于Bat
,但他们彼此之间并不了解,Bat
的情况除外。
如何获取Quk
的构造函数以确保其Baz
参数和Foo
参数具有相同的class MyAdapter extends ArrayAdapter<Places> {
Context context=null;
public MyAdapter(Context context, List<Places> objects) {
super(context, R.layout.list_item, objects);
this.context=context;
}
类型?
我正在使用Scala 2.11.8。
答案 0 :(得分:1)
您可以对Aux
及其相关类型Bar
使用foo
类别别名技巧:
object Bar {
type Aux[T, F] = Bar[T] { type foo = F }
// BarOne ...
}
现在您可以按如下方式定义Bat
:
case class Bat[B, F <: Foo](r: Quk[B], z: Baz[F])(implicit bar: Bar.Aux[B, F])
您的示例现在编译:
val x = Bat(Quk(1), BazOne)
// x: Bat[Int,FooOne.type] = Bat(Quk(1),BazOne)