【发布时间】:2018-09-14 14:55:05
【问题描述】:
以下示例:
我有一项可以“启动”任何车辆的服务
interface VehicleStarterService<T: Vehicle> {
fun <T : Vehicle> start(vehicle: Class<T>): String {
return vehicle.start
}
}
我想按名称启动一个车辆类型,例如“Car”,这需要我创建一个 VehicleStarterService;但是我似乎无法找到一种方法来用按名称实例化的类来实例化接口。
我想做一些类似(但不能)的事情:
val cls = "Car"
val kClass = Class.forName(cls).kotlin
val service = VehicleStarterService<kClass>()
service.start
我最终不得不执行以下操作(为我需要的每个参数化类型创建一个服务):
class CarStarterService : VehicleStarterService<Car> {
fun <T> execute() : String {
return start(User::class.java)
}
}
有没有办法以这种方式实例化参数化类?
【问题讨论】:
-
我会说不。类型实例化必须在编译时发生,但字符串中的类型名称仅在运行时才知道。根据
start真正应该做什么,也许泛型不是必需的,所有车辆的通用接口加上特定车辆的类对象就足够了。 -
你要做的就相当于一个raw类型,所以就用raw类型吧。
标签: java generics kotlin parameterization