在Java中实现Kotlin接口

3

在这个问题之后,我基本上利用反射来传递原始引用以修改原始引用本身,例如:

_begin("Another Window", ::showAnotherWindow)

我正在寻找可以实现类似功能的Java方法,目前我正在使用普通的原始数组:

private boolean[] showAnotherWindow = {false};
imgui.begin("Another Window", showAnotherWindow);

@hotkey建议我可以创建一个实现KMutableProperty0接口的类,并自动获取和设置相应的变量。

例如:

KMutableProperty0<Boolean> prop = 
  PropUtils.javaProp(this, t -> t.showAnotherWindow, (t, r) -> { t.showAnotherWindow = r; });
           
_begin("Another Window", prop);

所以,我想试一下并在Java中实现了以下内容。
Getter: Getter:
@FunctionalInterface
public interface Getter<T> {

    T get();
}

Setter:

@FunctionalInterface
public interface Setter<T> {

    void set(T type);
}

然后是类本身(我只写了构造函数,所有方法都是接口请求并由IDE自动实现的):

public class JavaProp <T> implements KMutableProperty0<T> {

    private imgui.Getter<T> getter;
    private imgui.Setter<T> setter;

    public JavaProp(imgui.Getter<T> getter, imgui.Setter<T> setter) {
        this.getter = getter;
        this.setter = setter;
    }

    @Override
    public void set(T t) {
        setter.set(t);
    }

    @NotNull
    @Override
    public Setter<T> getSetter() {
        return null;
    }

    @Override
    public T get() {
        return getter.get();
    }

    @Nullable
    @Override
    public Object getDelegate() {
        return null;
    }

    @NotNull
    @Override
    public Getter<T> getGetter() {
        return null;
    }

    @Override
    public T invoke() {
        return null;
    }

    @Override
    public boolean isLateinit() {
        return false;
    }

    @Override
    public boolean isConst() {
        return false;
    }

    @NotNull
    @Override
    public String getName() {
        return null;
    }

    @NotNull
    @Override
    public List<KParameter> getParameters() {
        return null;
    }

    @NotNull
    @Override
    public KType getReturnType() {
        return null;
    }

    @NotNull
    @Override
    public List<KTypeParameter> getTypeParameters() {
        return null;
    }

    @Override
    public T call(Object... objects) {
        return null;
    }

    @Override
    public T callBy(Map<KParameter, ?> map) {
        return null;
    }

    @Nullable
    @Override
    public KVisibility getVisibility() {
        return null;
    }

    @Override
    public boolean isFinal() {
        return false;
    }

    @Override
    public boolean isOpen() {
        return false;
    }

    @Override
    public boolean isAbstract() {
        return false;
    }

    @NotNull
    @Override
    public List<Annotation> getAnnotations() {
        return null;
    }
}

但是每当我尝试运行它,我会得到以下错误:
``` Error:(45, 12) java: reference to Getter is ambiguous both interface kotlin.reflect.KProperty0.Getter in kotlin.reflect.KProperty0 and interface kotlin.reflect.KProperty.Getter in kotlin.reflect.KProperty match ```
有问题的函数就是这个函数
  @NotNull
  @Override
  public Getter<T> getGetter() {
      return null;
  }

相关文件是kotlin.reflect.KProperty.tk,你可以在这里找到它。

有什么想法可以解决它吗?

1个回答

2

只需指定您要使用的接口:

public KProperty0.Getter<T> getGetter()

但我更希望在Kotlin中实现这个类,并且只从Java中调用它。


好主意,我写了这个,对于如何实现TODO()字段有任何建议吗? - elect

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接