【问题标题】:Scala generics - simplify number of generic argumentsScala 泛型 - 简化泛型参数的数量
【发布时间】:2021-08-19 15:54:11
【问题描述】:

我将这个类定义如下:

abstract class MyHelper[T, E <: BaseHelper[T]](implicit clsTag: ClassTag[E]) {

  val all: Array[E]

  def parse(t: T): Try[E] = { ... }
}

这就是我使用它的方式:

trait IntHelper extends BaseHelper[Int] {}

object MyIntHelper extends MyHelper[Int, IntHelper] { }

如何简化 MyHelper 类定义以仅接受内部泛型类型 T 而不是传递两种类型 E 和 T?

【问题讨论】:

    标签: scala generics


    【解决方案1】:

    您无需在MyHelper 中直接强制执行T,因为您只是在使用E 本身。

    所以这样的事情应该没问题。

    abstract class MyHelper[E <: BaseHelper[_]](implicit clsTag: ClassTag[E]) {
      val all: Array[E]
    }
    

    一个更充实的例子如下:

    trait BaseHelper[T] {}
    trait IntHelper extends BaseHelper[Int]
    
    abstract class MyHelper[E <: BaseHelper[_]](implicit clsTag: ClassTag[E]) {
      val all: Array[E]
    }
    
    object MyIntHelper extends MyHelper[IntHelper] { 
      override val all = Array(new IntHelper{}, new IntHelper{}) 
    }
    
    // just to ensure it works
    MyIntHelper.all
    

    【讨论】:

    • 感谢您的回复。我试过了,但没有用,这是因为我在MyHelper 中使用了T。我修改了示例代码以包含一个 parse 函数来说明这个用例。
    • 如果您需要同时使用 T 和 E 作为类型,我看不到一个明显的方法来声明两者。我想知道您是否可以在模式中使用隐式,这样就不必直接指定 BaseHelper,但是仍然需要它的类型。
    • 对不起,我帮不上忙。祝你好运。
    猜你喜欢
    • 2017-08-21
    • 2022-01-25
    • 2015-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-21
    • 2019-03-16
    • 1970-01-01
    相关资源
    最近更新 更多