使用更高级的类型类型构造函数重载并访问类型构造函数参数

时间:2015-08-12 18:01:24

标签: scala generics overloading higher-kinded-types

我有一个无参数值的方法,我想用另一种采用更高通道类型构造函数的方法重载。我还想在方法体中使用类型构造函数参数。我也想捕获类标记。这是我认为应该可行的:

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]。我是否达到了语言的限制?非高级方法签名是否过于开放,使得编译器无法消除其他方面的歧义?这种类型参数重载模式是否有更好的惯用方法?

1 个答案:

答案 0 :(得分:0)

根本不能仅根据类型参数重载方法,因为它们不存在于JVM中:就它而言,两种方法都是def method(): Foo。从技术上讲,编译器可以通过在字节码中为重载方法提供不同的名称来允许它,但Java和Scala都不这样做。

  

对于这种类型参数重载模式,是否有更好的惯用方法?

您可以为其中一个方法提供一个虚拟隐式参数(DummyImplicit中有一个Predef类型。)