在Scala方法中返回类类型的选项

时间:2016-09-29 20:10:27

标签: scala generics introspection

我正在为处理Sub DeleteRowBasedOnCriteria() Dim RowToTest As Long For RowToTest = Cells(Rows.Count, 14).End(xlUp).Row To 2 Step -1 With Cells(RowToTest, 14) If .Value <> "Completed" _ Then _ Rows(RowToTest).EntireRow.Delete End With Next RowToTest End Sub 类型而努力处理我正在编写的内容,答案可能涉及泛型,但我有点坚持正确的解决方案应该是什么。

我有一个Scala类Class,它有几个子类(VehicleCarBusTrain等):

Motorcycle

我现在正在尝试编写一个实用程序方法,可以将String映射到class Vehicle { ... } class Car extends Vehicle { ... } class Motorcycle extends Vehicle { ... } 子类(即Vehicle一个实例类):

Class

问题是我混淆/模糊类型与实例。我不希望object VehicleUtils { def mapToVehicleType(vehicleType : String) : Vehicle = { var vType : Vehicle = null if(vehicleType == "car") { vType = Car } else if(vehicleType == "motorcycle") { vtype = Motorcycle } else if(...) { ...etc. } vType } } 方法返回{em>实例,例如mapToVehicleType。如果提供“Car”作为输入,我希望它只返回Car类等。任何人都可以找到我出错的地方以及解决方案是什么。如果可能,我还想使用Scala car,因为Options方法肯定可以返回mapToVehicleType

2 个答案:

答案 0 :(得分:3)

Scala提供classOf[T]来获取类的类类型。例如:classOf[Car]返回类型为Class[Car]的实例。

为了映射到适当的类类型,您可以使用模式匹配将提供的字符串中的类型映射到Option

def mapToVehicleType(vehicleType: String): Option[Class[_ <: Vehicle]] = {
    vehicleType match {
        case "car"        => Some(classOf[Car])
        case "motorcycle" => Some(classOf[Motorcycle])
        case _            => None
    }
}

答案 1 :(得分:1)

你为什么要上课?这确实是关键问题。如果您要使用反射动态实例化,您可能会考虑使用不同的模式。

反射是经常用来克服Java限制的事情之一(我假设你来自Java)。但是Scala中通常有更好的模式。

你可以返回课程(例如classOf [Car])但考虑更好的算法。

让我们说,为了争论,你将这个班级作为一个&#34;工厂&#34;返回。我不确定这是最好的模式,但你可能会考虑这样的事情而不是反思:

object GetVehicleCreator {
  def apply(vehicleType: String): Option[() => Vehicle] = vehicleType match {
    case "car" =>
      Some(() => new Car)
    case "motorcycle" =>
      Some(() => new Motorcycle)
    case _ =>
      None
  }
}

请注意,它不是&#34; utils&#34;宾语。使用&#34; utils&#34;在Scala IMO中是一种反模式(老实说,我也不喜欢Java中的这种模式)。只需创建一个功能。任何带有apply方法的东西都是函数。使用:

val vehicleOption: Option[Vehicle] = for {
  fn <- GetVehicleFactory("car")
  vehicle <- fn()
} yield vehicle

...但我又要知道你想要完成什么。我打赌它有一个更好的模式。