gpt4 book ai didi

java - 带有监听器的抽象 Java 类,监听器在其回调中使用具体类

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:44:52 25 4
gpt4 key购买 nike

我想要一个像这样的抽象 Java 类:

abstract class AbstractFoo<F extends AbstractFoo<F, L>, L extends FooListener<F, L>> {
private final Class<L> listenerClass;
protected AbstractFoo(Class<L> listenerClass) {
this.listenerClass = listenerClass;
}

interface FooListener<F extends AbstractFoo<F, L>, L extends FooListener<F, L>> {
void callback(F foo);
}

// Bar might implement FooListener, but I don't control it,
// so I have no guarantee
public void externalMethod(Bar bar) {
if (listenerClass.isInstance(bar)) {
L listener = listenerClass.cast(bar);

listener.callback(this); // does not compile
}
}
}

listener.callback(this); 无法编译,因为无法保证 thisF 的类型相同。是否有可能以某种方式保证 Fthis 的父类(super class)型?

最佳答案

您要做的是使用泛型在 Java 中模拟 SELF 类型。参见 this linka different site对于一些这样做的手段。但是,没有办法强制 F(或 SELF 类型)实际上是同一类型,例如(参见 ConcreteFoo2 的类型参数):

static class Bar implements FooListener<ConcreteFoo, Bar> {

@Override
public void callback(final ConcreteFoo foo) {
// TODO Auto-generated method stub

}

}

static class ConcreteFoo2 extends AbstractFoo<ConcreteFoo, Bar> {

protected ConcreteFoo2(final Class<Bar> listenerClass) {
super(listenerClass);
}

}

static class ConcreteFoo extends AbstractFoo<ConcreteFoo, Bar> {

protected ConcreteFoo(final Class<Bar> listenerClass) {
super(listenerClass);
}

}

我不会继续这样做,而是首先考虑导致您来到这里的设计选择:

  • 听众真的需要知 Prop 体类吗?

  • AbstractFoo 真的需要知道监听类的具体实现吗?

也许更少的类型参数实际上是解决方案,仅依赖于接口(interface)。


编辑:如果您不想转换 (F) this,一个可能的解决方案是提供一个抽象方法 protected abstract F getSelf();具体实现通过返回this实现。

例如,请参阅此简化代码:

static final class Bar implements FooListener<ConcreteFoo> {

@Override
public void callback(final ConcreteFoo foo) {
// TODO Auto-generated method stub

}

}

static final class ConcreteFoo extends AbstractFoo<ConcreteFoo> {

protected ConcreteFoo(final Class<? extends FooListener<ConcreteFoo>> listenerClass) {
super(listenerClass);
}

@Override
protected ConcreteFoo getSelf() {
return this;
}

}

static abstract interface FooListener<FOO extends AbstractFoo<FOO>> {

void callback(FOO abstractFoo);
}

static abstract class AbstractFoo<SELF extends AbstractFoo<SELF>> {

private final Class<? extends FooListener<SELF>> listenerClass;

protected AbstractFoo(final Class<? extends FooListener<SELF>> listenerClass) {
this.listenerClass = listenerClass;
}

protected abstract SELF getSelf();

// Bar might implement FooListener, but I don't control it,
// so I have no guarantee
public void externalMethod(final Bar bar) {
if (listenerClass.isInstance(bar)) {
final FooListener<SELF> listener = listenerClass.cast(bar);

listener.callback(getSelf()); // compiles
}
}
}

关于java - 带有监听器的抽象 Java 类,监听器在其回调中使用具体类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56105522/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com