明月本无情,安能慰良人。
Java 代码使用 范型T 的方法,在Kotlin代码中使用时,报错 : Cast expression adapter to Nothing
如下图所示:
使用java代码写的调用使用范型T的adapter,如下,这是正常的
AutoFlowLayout flowLayout1 = (AutoFlowLayout) findViewById(R.id.autoflowlayout1);
ArrayList list = new ArrayList<String>();
FlowAdapter adapter = new FlowAdapter(list) {
@Override
public View getView(int position) {
View item = LayoutInflater.from(Test2Activity.this).inflate(R.layout.item_flowlayout, null);
return item;
}
};
flowLayout1.setAdapter(adapter);
复制到Kotlin代码中,androidstudio 自动将java代码转为kotlin代码,转完后的提示错误的代码
val list: java.util.ArrayList<*> = java.util.ArrayList<String>()
val adapter: FlowAdapter<*> = object : FlowAdapter<Any?>(list) {
override fun getView(position: Int): View {
return LayoutInflater.from(mActivity)
.inflate(R.layout.item_flowlayout, null)
}
}
autoflowlayout1.setAdapter(adapter)
按它的提示 to Nothing,改为这样
autoflowlayout1.setAdapter(adapter as Nothing)
运行时会报错.
问了一个微信名 为 伯言 的 大佬,给出了解决方案,但是我还是没太明白原因,只知道和范型T有关,java和kotlin的处理是不一样的。
解决后的代码
val list: java.util.ArrayList<String> = java.util.ArrayList<String>()
val adapter: FlowAdapter<String> = object : FlowAdapter<String>(list) {
override fun getView(position: Int): View {
return LayoutInflater.from(mActivity)
.inflate(R.layout.item_flowlayout, null)
}
}
(autoflowlayout1 as AutoFlowLayout<String>).setAdapter(adapter)
把 * 号 和 Any? 改为你的数据对象类型,我这里直接用的String,使用 autoflowlayout1 时强转一下就可以了。
转载请注明:劉清揚的博客 » 关于Kotlin 调用 Java中范型T 的错误