我使用以下初始化:
val entityClass = javaClass<Class<T>>()
var entity = entityClass.newInstance().newInstance()
Run Code Online (Sandbox Code Playgroud)
但它是错的,并导致IllegalAccessException上java.lang.Class.newInstance(Class.java:1208)
在C#中,您可以在泛型上放置一个新约束来创建泛型参数类型的新实例,在Kotlin中是否有等价物?
现在我的工作是:
fun <T> someMethod(class : () -> T) {
val newInstance = class()
}
Run Code Online (Sandbox Code Playgroud)
而我正在调用someMethod()
someMethod<MyClass>(::MyClass)
Run Code Online (Sandbox Code Playgroud)
但我想做这样的事情:
fun <T : new> someMethod() {
val newInstance = T()
}
Run Code Online (Sandbox Code Playgroud)
那可能吗?
总之,我想省略getT()下面例子中的重复.我已经读过在Kotlin中实例化一个泛型类型,但是它() -> T作为一个参数是什么意思?我该如何应用到下面?
interface Food
{
var isHeated:Boolean;
var name:String;
}
abstract class Cooker<T:Food>
{
abstract fun getT():T;
abstract fun enhance(t:T);
fun cook(): T
{
var food = getT();
food.isHeated = true;
food.name = "heated " + food.name;
enhance(food);
return food;
}
}
class PotatoChip:Food
{
override var isHeated = false;
override var name = "potato chip";
}
class PotatoChipCooker:Cooker<PotatoChip>()
{
override fun getT(): PotatoChip {
return PotatoChip();
}
override fun enhance(t:PotatoChip)
{
t.name …Run Code Online (Sandbox Code Playgroud)