【问题标题】:Type Constructor Overloading with Higher-kinded Types and Accessing the Type Constructor Parameter使用更高种类的类型重载类型构造函数并访问类型构造函数参数
【发布时间】:2015-11-05 11:32:28
【问题描述】:

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

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 &lt;: AnyRef]: Foo[T]。我是否达到了语言的限制?非高级方法签名是否过于开放,导致编译器无法区分两者之间的歧义?对于这种类型参数的重载模式,是否有更好的更惯用的方法?

【问题讨论】:

    标签: scala generics overloading higher-kinded-types


    【解决方案1】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-12-05
      • 2012-09-22
      • 1970-01-01
      • 2017-09-14
      • 1970-01-01
      • 1970-01-01
      • 2011-08-03
      • 2019-09-23
      相关资源
      最近更新 更多