我真的没有看到你的问题。请注意,泛型类型信息在运行时被删除(至少对于您显然正在使用的 JVM 变体)。因此,您使用哪种通用类型的服务基本上并不重要。您也可以只使用VehicleStarterService<Vehicle>
它,它将启动您的所有车辆。如果出于任何原因您需要调用特定的(其他!)函数,您仍然需要检查/转换为您的实际类型......所以我认为尝试获得该通用类型接口没有任何好处。
话虽如此,仍然有方法可以做到......(再次注意:这并不重要......泛型类型信息在运行时被删除......)
现在对于我的测试,我使用这个入口方法:
fun startAllTheVehicles(vararg vehicleTypes: String) {
startAllTheVehicles(*vehicleTypes.map { Class.forName(it) }
.map { it as Class<out Vehicle> }
.toTypedArray())
}
请注意,这it as Class<out Vehicle>
并不能确保您拥有 type 类Vehicle
。它只是确保您的代码在尝试调用声明Class<out Vehicle>
为参数类型的函数时编译。
因此,从那里开始,您可以使用以下方法之一来获得可用的实际泛型类型。我假设您newInstance
在启动服务中使用类似的东西。
接口上省略了泛型类型的示例(这种情况相当简单):
interface VehicleStarterService {
fun <T: Vehicle> start(vehicleType: Class<T>) = vehicleType.newInstance().start
}
上述入口函数使用一个服务启动所有车辆的示例方法:
fun <T : Vehicle> startAllTheVehicles(vararg vehicleTypes: Class<out T>) {
val service = object : VehicleStarterService {}
vehicleTypes.forEach { service.start(it) }
}
仍在使用具有泛型类型的接口(请注意有关out T
等的更改):
interface VehicleStarterService<T: Vehicle> {
fun start(vehicleType: Class<out T>) = vehicleType.newInstance().start
}
入口函数调用的示例方法,使用一项服务启动所有车辆:
fun <T : Vehicle> startAllTheVehicles(vararg vehicleTypes: Class<out T>) {
// actually it doesn't really matter which type we use...
val service = object : VehicleStarterService<Vehicle> {} // you could even use T instead of Vehicle
vehicleTypes.forEach { service.start(it) }
}
使用以下测试都按预期工作:
startAllTheVehicles("Car", "Truck")
使用实际上为 no 的类型调用它Vehicle
会给你一个ClassCastException
at 接口的start
-function。