在简单边界中表达类型不等式条件

时间:2014-08-13 22:08:13

标签: scala shapeless

import shapeless._

trait Something[T <: Something[T, R], R] {}
class Test[T <: Something[T, R], R, T1 <: Something[T1, _] <:!< T](t: T, t1: T1) {}

但我明白了:

type arguments [T1,?] do not conform to trait Something's type parameter bounds [T <: Something[T,R],R]

除非我希望这可行,否则这是有道理的:

class Test1[T <: Something[T, R], R, T1 <: Something[T1, R1] <:!< T, R1](t: T, t1: T1)

但它正在T1 <: Something[T, R]请求相同的界限。

我想要的是说这个类有4个类型的参数,每个参数描述Something[T <: Something[T, R], R]的不同后代。简单一点,强制执行T != T1

这样做的正确方法是什么?

1 个答案:

答案 0 :(得分:3)

一般例子

import shapeless._
class Foo[A, B](a: A, b: B)(implicit ev: A =:!= B)
val x = new Foo(1, "hello")
// x: Foo[Int,String] = Foo@4015d0b9

val y = new Foo(1, 2)
// error: ambiguous implicit values:
// both method neqAmbig1 in package shapeless of type [A]=> shapeless.=:!=[A,A]
// and method neqAmbig2 in package shapeless of type [A]=> shapeless.=:!=[A,A]
// match expected type shapeless.=:!=[Int,Int]
//              new Foo(1, 2)
//              ^

在您的具体案例中

class Test[A, B, T <: Something[T, A], T1 <: Something[T1, B]](t: T, t1: T1)(implicit ev: T =:!= T1)