【问题标题】:variable sized inputs of different types不同类型的可变大小输入
【发布时间】:2016-04-12 13:38:39
【问题描述】:

我有一堆SomeType[T] 类型的对象。就像其中一些是SomeType[String],一些是SomeType[Int],等等。我想编写一个函数来获取一组可变大小的这些(但可能是不同的类型)。

如果我知道类型都是相同的,我可以使用类似以下的内容:

def someFun[T](inputs: SomeType[T]*): = { 
   // do something here on the list of inputs. 
}

任何想法如何使其通用,以便它获得具有可能不同类型的输入列表? (例如inputs: SomeType[String] 和 inputs: SomeType[Int]) 顺便说一句,我不想​​使用SomeType[_],因为我稍后需要类型信息。

【问题讨论】:

  • 这个方法返回什么类型?您可以使用通配符SomeType[_],但您会丢失类型信息......所以答案实际上取决于该方法的主体需要什么。您实际上要寻找的是 K-list。
  • 好点。我不能做_,因为我稍后需要类型信息:-/
  • 看看Shapeless'HList.
  • 我认为简短的回答是,使用重复参数这是不可能的,但使用 shapeless.HList 之类的东西可以实现类似的效果。
  • 当你说“我不能做 _ 因为我稍后需要类型信息”时,你到底是什么意思?您需要哪种类型的信息?请记住,它们都是不同的,并且类型参数在运行时被删除。想象一下您尝试做的事情是可能的,然后发布一些示例代码,展示您将如何准确地使用这些参数。不,HList 对此也无济于事:您需要预先了解所有类型才能使用它,这是一个不同的用例。

标签: scala


【解决方案1】:

我不确定您需要类型信息来做什么,但如果您只需直接对输入做出反应(例如,不将其传递给另一个函数等),那么以下方法将起作用:

case class Box[A](a: A)

def someFun(boxes: Box[_]*) = 
  boxes.foreach {
    case Box(a: Int) => println(s"INT: $a")
    case Box(a: String) => println(s"STRING: $a")
    case _ => // and so on ...
  }

而且 AFAIK,shapeless 的 HList 并没有解决这个问题,因为它可以工作,你仍然需要预先设置类型。

【讨论】:

  • 非常好的建议。但问题是我不知道先验的可能类型。但我可以要求客户以某种方式通过它们。是否也可以使用可变大小的类型标签?
猜你喜欢
  • 2018-05-11
  • 1970-01-01
  • 2011-06-03
  • 1970-01-01
  • 2018-09-14
  • 1970-01-01
  • 2017-10-25
  • 1970-01-01
  • 2019-05-10
相关资源
最近更新 更多