[英]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));
編譯器將引發以下錯誤:
錯誤:類型不兼容:DrawerListItem無法轉換為CAP#1,其中CAP#1是一個新的類型變量:CAP#1從捕獲到的擴展BaseListItem? 擴展BaseListItem
我不明白為什么這應該是錯誤的。 DrawerListItem extends BaseListItem
而Screen extends BaseData
。 我嘗試閱讀其他有關泛型類型和類型參數的文章,但似乎都沒有解決這個問題。
嘗試這個:
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>>
在這種情況下。
因此,該錯誤基本上是說聲明的模板類型與所需的模板類型不同,因此是錯誤。 希望這對其他人有幫助。 謝謝大家的幫助!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.