Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Inheritance 如何使用成员在kotlin中定义类可以在java派生类中访问_Inheritance_Kotlin_Kotlin Interop - Fatal编程技术网

Inheritance 如何使用成员在kotlin中定义类可以在java派生类中访问

Inheritance 如何使用成员在kotlin中定义类可以在java派生类中访问,inheritance,kotlin,kotlin-interop,Inheritance,Kotlin,Kotlin Interop,具有在kotlin中定义的类,具有成员 @JvmField protected val clickHandler: BaseClickHandler @JvmField protected var layoutId : Int 但是在java中,当试图扩展这个类并访问成员时,它会出错 interface ViewDelegate { fun onCreateViewHolder(parent: ViewGroup): RecyclerView.ViewHolder fun o

具有在kotlin中定义的类,具有成员

@JvmField protected val clickHandler: BaseClickHandler
@JvmField protected var layoutId : Int
但是在java中,当试图扩展这个类并访问成员时,它会出错

interface ViewDelegate {

    fun onCreateViewHolder(parent: ViewGroup): RecyclerView.ViewHolder
    fun onBindViewHolder(holder: RecyclerView.ViewHolder, item: Data, position: Int)
}


open class ViewDelegateImp(@JvmField protected val clickHandler: BaseClickHandler) : ViewDelegate {

    @JvmField protected var layoutId = R.layout.default

    override fun onCreateViewHolder(parent: ViewGroup): RecyclerView.ViewHolder {
        return ItemViewHolder(parent.inflate(layoutId, false), clickHandler)
    }

    override fun onBindViewHolder(holder: RecyclerView.ViewHolder, item: Data, position: Int) {
        (holder as? ItemViewHolder)?.bindView(item, position)
    }
}

//extension:
fun ViewGroup.inflate(layoutId: Int, attachToRoot: Boolean = false): View {
    return LayoutInflater.from(context).inflate(layoutId, this, attachToRoot)
}
在java中,您希望从ViewDelegateImp派生,并重写var layoutId和使用受保护的val clickHandler

class DerivedDelegateImp extends ViewDelegateImp {

    public DerivedDelegateImp(BaseClickHandler clickHandler) {
        super(clickHandler);
        layoutId = R.layout.derived;  // want to use different layout, but get error "cannot resolve layoutId"
    }

    @Override
    public void onBindViewHolder(RecyclerView.ViewHolder holder, Data item, int position) {
        super.onBindViewHolder(holder, item, position);
    }

    @NotNull
    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent) {

        View vw = LayoutInflater.from(parent.getContext()).inflate(layoutId, parent, false);

        return new StoryItemViewHolder(vw, clickHandler); // here got error clickHandler has private access in ViewDelegateImp 

        //return super.onCreateViewHolder(parent);  //<== this is fine
    }
}
类派生的DelegateImp扩展了ViewDelegateImp{
公共派生的DelegateImp(BaseClickHandler clickHandler){
超级(clickHandler);
layoutId=R.layout.derived;//希望使用不同的布局,但出现错误“无法解析layoutId”
}
@凌驾
public void onBindViewHolder(RecyclerView.ViewHolder,数据项,int位置){
super.onBindViewHolder(支架、项目、位置);
}
@NotNull
@凌驾
public RecyclerView.ViewHolder onCreateViewHolder(视图组父级){
View vw=LayoutInflater.from(parent.getContext()).flate(layoutId,parent,false);
返回新的StoryItemViewHolder(vw,clickHandler);//此处出现错误clickHandler在ViewDelegateImp中具有私有访问权限

//return super.onCreateViewHolder(父级);//这必须是IDE的问题,无论其他(同步、清理、重建)尝试了什么,它只有在删除项目并重新克隆以获得新的代码库并重新添加这些代码后才起作用