【问题标题】:Scala : class[T] extends T?斯卡拉:类[T]扩展T?
【发布时间】:2016-05-08 02:53:45
【问题描述】:

问题:如何在 scala 或 Java 中实现以下模式?

trait A
case class B[Base](...) extends A with Base

这在 C++ 中是允许的:

template <class Base>
class B : public Base, public A

这就是我想要这样做的原因:

我有两个抽象语法树:ComplexFormSimpleForm

我有一个列表类型:case class L[T](list : List[T]) extends Complex Form with T

现在,L[SimpleForm] 应该是 extends SimpleForm with ComplexFormL[ComplexForm] 应该只有extend ComplexForm

我需要能够同时对所有L[T] 进行模式匹配以避免重复。

【问题讨论】:

  • @cchantep,我显然试过了:case class O[T](list: List[T]) extends T,错误是“(1) T 没有构造函数;(2) 需要类类型但找到了 T”
  • 泛型的工作方式与 c++ 模板不同,请参阅 stackoverflow.com/questions/18347167/…
  • 我不太清楚你想通过混合任意T 来实现什么。为什么包装器L[T] 也需要是T

标签: java scala generics inheritance


【解决方案1】:

大概是这样的吧?

trait Form
trait SimpleForm extends Form
trait ComplexForm extends Form
trait ListForm[+T <: Form] extends ComplexForm {
   def l: List[T]
}


case class SimpleList(val l: List[SimpleForm]) extends SimpleForm with ListForm[SimpleForm]
case class ComplexList(val l: List[ComplexForm]) extends ListForm[ComplexForm]

您可以像这样进行模式匹配:

 // ...
 case x:ListForm[Form] => doStuff(x.l)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-02-23
    • 2012-12-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-14
    • 2014-06-07
    • 1970-01-01
    相关资源
    最近更新 更多