【问题标题】:Writing a method to return a java Class constrained to a certain type in Scala在Scala中编写一个方法来返回一个限制为某种类型的java类
【发布时间】:2011-07-26 22:34:34
【问题描述】:
例如,我有这个:
abstract class Vehicle
class Car extends Vehicle
我想编写一个返回 java 类的方法,但仅限于车辆类型的类。
object CarDealer {
def getVehicularClass: Class[Vehicle] = classOf[Car]
}
我无法获得以下不同的工作方法:
-
我通常处理这个问题的方式
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]
-
使用抽象类型
type V <: Vehicle
使用隐式清单(似乎只限制方法参数而不限制返回值)
谁能帮忙?
谢谢!
【问题讨论】:
标签:
scala
types
parameterized
【解决方案1】:
Vehicle 是超类型。你不知道Vehicle 的某些子类型A 将包含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]
}
现在所有的承诺都被指定并兑现了。
【解决方案2】:
Class[T] 类型在T 类型中是不变的。因此即使A extends B,classOf[A] 不是classOf[B] 的子类型。因此,您的问题没有确切的解决方案...
【解决方案3】:
这个约束用存在类型充分表达:
object CarDealer {
def getVehicularClass: Class[_ <: Vehicle] = classOf[Car]
}
当然,可能还有其他要求使存在类型不合适,但您的问题并没有特别清楚地说明。