首页 > 解决方案 > 从由内部类型参数化的类继承

问题描述

我想要一个类B继承自一个A由内部类型参数化的泛型类B。具体来说,我想要这个(最小化的例子):

class A[T]
class B extends A[T] {
  class T
}

这样写,编译器不接受。有没有办法指定这种继承关系?(使用一些不同的语法或一些技巧。)

如果不是,那将是什么官方参考文件证明这是不可能的?

笔记:

标签: scalagenericstypes

解决方案


你可以试试

class A {
  type T
}
class B extends A {
  class T
}

val b: B = new B
val t: b.T = new b.T

我创建了T一个类型成员而不是类型参数。

这里一个类覆盖了一个类型。

如果还想T用作类型参数,可以引入 Aux-type

object A {
  type Aux[_T] = A { type T = _T }
}

并使用 typeA.Aux[T]代替您原来的A[T].


现在你在做

trait A[X]

class B {
  class T

  /*implicit*/ object typeclass extends A[T]
}

val b = new B
implicit val b_typeclass: b.typeclass.type = b.typeclass

val b1 = new B
implicit val b1_typeclass: b1.typeclass.type = b1.typeclass

implicitly[A[b.T]]
implicitly[A[b1.T]]

请注意,使对象typeclass隐式现在没用了。

如果您创建对象而不是值,则使对象typeclass隐式会很有用bb1

trait A[X]

class B {
  class T

  implicit object typeclass extends A[T]
}

object b extends B
object b1 extends B

implicitly[A[b.T]]
implicitly[A[b1.T]]

如果您想进行B扩展A,那么如前所述,我建议将类型参数替换A为类型成员。A仍然是一个类型类,只是类型成员类型类而不是类型参数类型类

trait A {
  type X
}

object A {
  type Aux[_X] = A {type X = _X}
}

class B extends A {
  type X = T

  class T
}

implicit object b extends B
implicit object b1 extends B

implicitly[A.Aux[b.T]]
implicitly[A.Aux[b1.T]]

推荐阅读