【问题标题】:passing arguments to method with generics in java在java中使用泛型将参数传递给方法
【发布时间】:2015-07-26 15:05:26
【问题描述】:

我有以下类和方法的结构:

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));

编译器抛出以下错误:

错误:不兼容的类型:无法将 DrawerListItem 转换为 CAP#1,其中 CAP#1 是一个新的类型变量:CAP#1 从捕获的 ? 扩展 BaseListItem扩展 BaseListItem

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

【问题讨论】:

  • 您的错误表明您使用的是ScreenPlay 而不是Screen。它还取决于您如何初始化mCurItems。你能把那部分代码放上去吗?

标签: java generics type-parameter


【解决方案1】:

试试这个:

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 {}
}

【讨论】:

    【解决方案2】:

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

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

    而 NavigationTree 期待:

    <T extends BaseListItem<? extends BaseData>>
    

    这基本上意味着:

    <DrawerListItem<? extends BaseData>>
    

    在这种情况下。

    因此错误基本上是说声明的模板类型与所需的模板类型不同,因此错误。 希望这对其他人有帮助。 感谢大家的帮助!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-06-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多