在 java 中使用泛型将参数传递给方法

passing arguments to method with generics in java

我有以下类结构和方法:

public class NavigationTree<T extends BaseListItem<? extends BaseData>> {
    public boolean insert(final T parent, final T child){
    }
}

public class Screen extends BaseData {
}

public class DrawerListItem<T> extends BaseListItem<T>{
}

这是我从另一位 类 打来的电话:

mCurItems.insert(new DrawerListItem<Screen>(null, null),
                 new DrawerListItem<Screen>(screen.name, screen));

编译器抛出以下错误:

Error: incompatible types: DrawerListItem cannot be converted to CAP#1 where CAP#1 is a fresh type-variable:CAP#1 extends BaseListItem from capture of ? extends BaseListItem

我不明白为什么这是错误的。 DrawerListItem extends BaseListItemScreen extends BaseData。我已经尝试阅读有关泛型类型和类型参数的其他帖子,但其中 none 似乎解决了这个问题。

试试这个:

public class Test {
    public static void main(String[] args) throws java.lang.Exception {
        NavigationTree<DrawerListItem<Screen>> nt = new NavigationTree<>();
        nt.insert(new DrawerListItem<Screen>(), new DrawerListItem<Screen>());
    }

    private static class NavigationTree<T extends BaseListItem<? extends BaseData>> {
        public boolean insert(final T parent, final T child) {
            return true;
        }
    }

    private static class DrawerListItem<T> extends BaseListItem<T> {}
    private static class BaseListItem<T> {}
    private static class Screen extends BaseData {}
    private static class BaseData {}
}

我想出了解决办法。在我的 DrawerListItem 声明中,我将其声明为

public class DrawerListItem<T> extends BaseListItem<T>{
}

而 NavigationTree 期待:

<T extends BaseListItem<? extends BaseData>>

这基本上意味着:

<DrawerListItem<? extends BaseData>>

在这种情况下。

因此错误基本上是说声明的模板类型与所需的模板类型不同,因此出现错误。 希望这可以帮助别人。 感谢大家的帮助!