【发布时间】:2015-12-16 22:55:27
【问题描述】:
给定一个带有类型参数T 的类A,我该如何进一步限制T 的特定功能?在下面的示例中,我想强制 foo 只能在 T 是 Int (或者,如果你喜欢的话)的子类型时被调用。 IE。 new A[Int]().foo() 应该编译,但 new A[Double]().foo() 不应该编译。
我可以通过T => Int 中的隐式转换实现我想要的,如foo 所示。然而,这会导致不必要的方法调用——隐含的证据是恒等函数。还有就是不好看……
class A[T] {
val someValue: T = ???
def foo()(implicit ev: T => Int): Int = ev(someValue)
// some ideas that don't quite work
// def bar[T2 <: Int :EqualTo[T]](t2: T2): T = t2.asInstanceOf[T]
// def bam[T2 <: T with Int](): Int = someValue.asInstanceOf[Int]
def thisOneDefinesItsOwnConstraintType[Z <: Int](z: Z): Z = z
def thisOneDoesNotNeedToConstrainT(t: T): T = someValue
}
如果不需要施法,该解决方案将获得加分:)
注意:我知道我可以在类或方法级别定义类型约束(请参阅thisOneDefinesItsOwnConstraintType),但这对我没有帮助,因为我还有一些不需要约束类型的方法(见thisOneDoesNotNeedToConstrainT)。
【问题讨论】: