Java多级泛型参数

移动开发 2026-07-07

我在尝试在多个类中扩展 MutableLiveData,每个类都继承前一个,如下所示(下面的行可以直接粘贴到Java文件中,用于测试/静态检查它们):

class ALiveData<T> extends MutableLiveData<T> { }
interface OneInterface {
    void methodOne();
}
class BLiveData<K,T> extends ALiveData<OneInterface> {
    @Override
    public void observe(LifecycleOwner owner, Observer<? super OneInterface> observer) {
        // THIS IS OK
    }
}
interface TwoInterface<K,T> extends OneInterface {
    void mathodTwo();
}
abstract class SomeClass<K,T> implements TwoInterface<K,T> { }
class CLiveData<K,T> extends BLiveData<K,List<T>> {
    @Override
    public void observe(LifecycleOwner owner, Observer<? super TwoInterface<K,T>> observer) {
        // not valid in compilation
    }
    @Override
    public void observe(LifecycleOwner owner, Observer<SomeClass<K,T>> observer) {
        // not valid in compilation
    }
    @Override
    public void observe(LifecycleOwner owner, Observer<? super OneInterface> observer) {
        // this is the only accepted observer() but I don't want to
        // observe by its basic OneInterface because it doesn't have
        // all TwoInterface methods and I don't want the caller need
        // to cast it every time.
    }
}
//------- testing instantiations --------
{
    (new CLiveData<Byte,Integer>()).observe(null, new Observer<TwoInterface<Byte, Integer>>() {
        @Override
        public void onChanged(TwoInterface<Byte, Integer> byteIntegerTwoInterface) {

        }
    });
}

我希望能够通过传递一个 new Observer<TwoInterface<Byte,Integer>> 而不是基本的 new Observer<? super OneInterface> 来实现 CLiveData.observe(),因为需要观察 CLiveData 的人需要使用 TwoInterface,而不是它的基本 OneInterface

我还遗漏了什么?

解决方案

Observer<? super OneInterface> 并不意味着子类可以随意替换成任何它们想要的类型。子类必须使用 Observer<? super OneInterface> 作为参数类型。别无他物。这个类型意味着“观察者类型参数是一个在编译时尚未确定的特定类型,可能是OneInterface或可能是OneInterface的超类。”这并不意味着“子类可以在编译时自由选择类型。”

如果你想让Observer参数有所变化,你需要为它再添加一个泛型类型参数:

class BLiveData<K,T,D extends OneInterface> extends ALiveData<D> {
    @Override
    public void observe(LifecycleOwner owner, Observer<? super D> observer) {
        // ...
    }
}

class CLiveData<K,T> extends BLiveData<K,List<T>,TwoInterface<K,T>> {
    @Override
    public void observe(LifecycleOwner owner, Observer<? super TwoInterface<K,T>> observer) {
        // ...
    }
}
站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章