我有一个无参数值的方法,我想用另一种采用更高通道类型构造函数的方法重载。我还想在方法体中使用类型构造函数参数。我也想捕获类标记。这是我认为应该可行的:
trait SomeContainer[+A]
trait Foo[+A]
class SomeClass {
// The simple variant
def method[T <: AnyRef]: Foo[T]
// Now the overloaded higher-kinded variant
def method[F[T <: AnyRef : Manifest] <: SomeContainer[T]]: Foo[T] = {
val classTag = manifest[T]
// Do something with it
}
}
但是,我根本无法访问T
。这里的目的是使这里的高级方法超载非高级的一个def method[T <: AnyRef]: Foo[T]
。我是否达到了语言的限制?非高级方法签名是否过于开放,使得编译器无法消除其他方面的歧义?这种类型参数重载模式是否有更好的惯用方法?
答案 0 :(得分:0)
根本不能仅根据类型参数重载方法,因为它们不存在于JVM中:就它而言,两种方法都是def method(): Foo
。从技术上讲,编译器可以通过在字节码中为重载方法提供不同的名称来允许它,但Java和Scala都不这样做。
对于这种类型参数重载模式,是否有更好的惯用方法?
您可以为其中一个方法提供一个虚拟隐式参数(DummyImplicit
中有一个Predef
类型。)