1

例如,我有这个:

abstract class Vehicle

class Car extends Vehicle

而且我想编写一个返回java类的方法,但仅限于车辆类型的类。

object CarDealer {
  def getVehicularClass: Class[Vehicle] = classOf[Car]
}

我无法获得以下不同的工作方法:

  1. 我通常处理这个的方式

    object CarDealer {
      def getVehicularClass[A <: Vehicle]: Class[A] = classOf[Car]
    }
    
    [error]  found   : java.lang.Class[Car](classOf[Car])
    [error]  required: Class[A]
    [error]   def getVehicularClass[A <: Vehicle]: Class[A] = classOf[Car]
    
  2. 使用抽象类型

    type V <: Vehicle
    
  3. 使用隐式清单(似乎它只限制方法参数而不是返回值)

任何人都可以帮忙吗?

谢谢!

4

3 回答 3

1

Vehicle是超类型。你不知道某个子类型AVehicle包含Car,所以你不能这样写。如果有人问Bus怎么办?无能为力CarDealer,但类型签名承诺它可以使其适用于您要求的任何内容。 A <: Vehicle

如果您不关心保留车辆的真实类型,只需写

object CarDealer {
  def getVehicularClass: Class[Vehicle] = classOf[Car]
}

或者,如果您希望遵循某些界面,请在界面中指定您想要的内容:

trait VehicleClass[A <: Vehicle] {
  def getVehicularClass: Class[A]
}

然后你有你的对象状态它承诺返回的车辆子类:

object CarDealer extends VehicleClass[Car] {
  def getVehicularClass = classOf[Car]
}

现在所有的承诺都被指定并兑现了。

于 2011-07-26T23:00:19.653 回答
0

类型Class[T]在 type 中是不变的T。因此即使A extends B,classOf[A]也不是 的子类型classOf[B]。因此,您的问题没有确切的解决方案...

于 2011-07-27T05:40:55.820 回答
0

这个约束用存在类型充分表达:

object CarDealer {
  def getVehicularClass: Class[_ <: Vehicle] = classOf[Car]
}

当然,可能还有其他要求使存在类型不合适,但您的问题并没有特别清楚地说明。

于 2011-07-27T22:07:44.220 回答