簡體   English   中英

如何迭代列表<? extends E>在 Java 中並使用實際對象?

[英]How to iterate over List<? extends E> in Java and use the actual object?

所以我知道要迭代我可以使用 for-each 或 Iterator。 但我的問題是我想通過條件刪除一些元素來創建一個相同類型的新列表。 對於前-

List<? extends E> myList;
List<? extends E> newList = new ArrayList<>();
for(E element: myList) {
   if(element.getName().equals("abc")) {
      newList.add(element); // would throw an error because the list is of a different type. 
   }
}

我該怎么做? 有什么不同的方法來解決這個問題嗎?

你可以這樣嘗試:

List<? extends E> newList = myList.stream().filter(x -> x.getName().equals("abc")).collect(Collectors.toList());

但是,如果您需要隱藏在“?”后面的類型。 那么您將需要在循環內部檢查元素是否是某個類的實例,但無法將您的元素添加到 List<? 擴展 E>

所以這將起作用:

public static void main(String[] args) {
        List<? extends E> myList  = new ArrayList<>();;

        List<E> newList = new ArrayList<>();

        for(E element: myList) {
            if (element instanceof D) {
                D elementD = (D)element;
                if(elementD.getName().equals("abc")) {
                    newList.add(elementD); // would throw an error because the list is of a different type.
                }

            }
        }

    }

這也將工作

public static void main(String[] args) {
        List<? extends E> myList  = new ArrayList<>();;

        List<D> newList = new ArrayList<>();

        for(E element: myList) {
            if (element instanceof D) {
                D elementD = (D)element;
                if(elementD.getName().equals("abc")) {
                    newList.add(elementD); // would throw an error because the list is of a different type.
                }

            }
        }

    }

但這行不通:

public static void main(String[] args) {
        List<? extends E> myList  = new ArrayList<>();;

        List<? extends E> newList = new ArrayList<>();

        for(E element: myList) {
            if (element instanceof D) {
                D elementD = (D)element;
                if(elementD.getName().equals("abc")) {
                    newList.add(elementD); // would throw an error because the list is of a different type.
                }

            }
        }

    }

您不能將任何非null值添加到List<? extends E> List<? extends E> ,因為編譯器無法驗證該類型是否與未知類型匹配。

您需要告訴編譯器這兩個列表實際上是相同的類型以允許這樣做。 您可以通過將代碼提取到單獨的方法來做到這一點:

List<? extends E> myList;
List<? extends E> newList = filterList(myList);
...

private <T extends E> List<T> filterList(List<T> myList) {
  List<T> newList = new ArrayList<>();
  for(T element: myList) {
    if(element.getName().equals("abc")) {
        newList.add(element);
    }
  }
  return newList;
}

這樣你基本上“命名”匿名類型? extend E ? extend E並在方法調用期間將其稱為T 現在編譯器知道你在做什么是合法的。

我做了類似的事情

mylist.removeIf(element -> element.getName().equals("abc"));

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM