scala - 从由内部类型参数化的类继承
问题描述
我想要一个类B
继承自一个A
由内部类型参数化的泛型类B
。具体来说,我想要这个(最小化的例子):
class A[T]
class B extends A[T] {
class T
}
这样写,编译器不接受。有没有办法指定这种继承关系?(使用一些不同的语法或一些技巧。)
如果不是,那将是什么官方参考文件证明这是不可能的?
笔记:
是的,我想
T
成为一个内部阶层。我确实希望单独的实例B
具有不兼容的类型T
。这个问题考虑了相同的情况,但不询问是否/如何可能,而是询问其他方式来编写相同的内容。(至少答案似乎是这样解释的。)无论如何,这个问题已有十年之久,而 Scala 可能已经发展了。
澄清:我想
B
从 继承A
,而不是从 的内部类A
,或者有一个B
继承自的内部类A
。原因是我想在以下情况下使用它:A
是一个类型类。B
应该提供一种快速的方法来轻松生成该类型类的新类(使用最少的样板)。我希望该类的用户执行以下操作:implicit val X = createBInstance()
,然后他们将能够使用该类型X.T
并且它将具有类型 classA
。到目前为止,我管理的最好的方法是支持该模式val X = createBInstance(); implicit val xTypeclass = X.typeclass
并使用X.T
. 这意味着更多样板,可能会忘记某些东西,并且会更多地污染命名空间(附加名称xTypeclass
)。(对于非常好奇的:A
是MLValue.Converter
,B
isQuickConverter
, andX
isHeader
//RuntimeError
...在我的代码中。)
解决方案
你可以试试
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
隐式会很有用b
b1
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]]
推荐阅读
- mongodb - Mongo加入特定列
- sql-server - 选择列作为 SQL SERVER 中另一个表中值的列名
- node.js - 将 json 对象存储到 Azure Blob 存储
- postgresql - 支持并行查询执行的 Google Cloud SQL Postgres 9.6
- java - 如何访问文件java中的每个单词?
- angular - 尝试生成管道时超出最大调用堆栈大小
- c# - 通用列表的项目都相同
- python-3.x - 在不和谐的消息中添加表情符号时延迟(Python)
- android - 为什么必须将“Dispatchers.Main”添加到 Activity CoroutineScope 实现的根作业中?
- excel - 参考另一张纸上的单元格