大佬们遇到过这个问题吗?关于Kotlin反射中实例化类的问题

先上java代码:
publicclassTUtil{
publicstaticTgetT(Objecto,inti){
try{
return((Class)((ParameterizedType)(o.getClass()
.getGenericSuperclass())).getActualTypeArguments()[i])
.newInstance();
}catch(InstantiationExceptione){
}catch(IllegalAccessExceptione){
}catch(ClassCastExceptione){
}
returnnull;
}
}
//调用者只需要:
publicabstractclassBaseMVPActivity
···省略代码····
mPresenter=TUtil.getT(this,0);
mModel=TUtil.getT(this,1);
···省略代码····
我尝试使用kotlin去写这个util类:
classKClassUtil{
companionobject{
inlinefungetKType(K:Any,position:Int):T{
varparameterizedType=K::class.java.genericSuperclassasParameterizedType
varactualTypeArguments=parameterizedType.actualTypeArguments
return(actualTypeArguments[position].javaClassasClass).newInstance()
}
}
}
//调用者只需要:
abstractclassBaseMVPActivity,E:BaseModel>:BaseActivity()
···省略代码····
mPresenter=KClassUtil.getKType(this,0)//这里报错了
mModel=KClassUtil.getKType(this,1)//这里报错了
···省略代码····
Cannotuse'T'asreifiedtypeparameter.Useaclassinstead.
这里kotlin中一定要我写入具体的Class,但由于这里是抽象类无法知道具体的class是什么,请问如何解决这个问题?
jeck猫
浏览 1047回答 2
2回答

拉风的咖菲猫

你无法获取这个泛型T的class,正确的获取方法应该是在BaseMVPActivity声明一个抽象的protected变量,由具体的activity去实现这个变量,比如protectedabstractvalpresenterClassToken:Class然后,在具体的activity继承这个BaseMVPActivity的时候,实现这个变量,XXXPresenter指具体的presenter实现类classXXXXActivity(overridevalpresenterClassToken:Class):BaseMVPActivity以上,请参考

慕森卡

reifiedT没必要去实化泛型参数,因为在其内部并没有需要获取T::class的地方。按照你的思路的话,直接保持原有Java的写法就可以了:objectTUtil{fungetT(o:Any,i:Int):T?{try{return((o.javaClass.genericSuperclassasParameterizedType).actualTypeArguments[i]asClass).newInstance()}catch(e:InstantiationException){}catch(e:IllegalAccessException){}catch(e:ClassCastException){}returnnull}}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript