Как бросить универсальные типы Списка в Java?

Kotlin

У меня также была проблема, потому что я был в дочернем фрагменте. Я мог бы использовать:

    supportFragmentManager.fragments.forEach {
        it.childFragmentManager.fragments.forEach { fragment ->
            if (fragment is HomeFragment) {
                //do something
            } 
        }

, но один сотрудник оптимизировал его с помощью:

     if( findNavController(R.id.nav_host_fragment).currentDestination?.id == R.id.homeFragment) {
       // do something
   }
15
задан jrharshath 25 May 2009 в 09:16
поделиться

5 ответов

Не нужно кастовать. LinkedList реализует List , поэтому вам не нужно выполнять приведение здесь.

Даже если вы хотите преобразовать его в список List из Object s, вы можете сделать это с помощью универсальных шаблонов, как в следующем коде:

LinkedList<E> ll = someList;
List<? extends Object> l = ll; // perfectly fine, no casting needed

Теперь, после вашего редактирования, я понимаю, что вы пытаетесь сделать, и это невозможно без создания нового List вот так:

LinkedList<E> ll = someList;
List<Object> l = new LinkedList<Object>();
for (E e : ll) {
    l.add((Object) e); // need to cast each object specifically
}

и я объясню, почему иначе это невозможно. Подумайте об этом:

LinkedList<String> ll = new LinkedList<String>();
List<Object> l = ll; // ERROR, but suppose this was possible
l.add((Object) new Integer(5)); // now what? How is an int a String???

Для получения дополнительной информации см. Учебник по универсальным шаблонам Sun Java . Надеюсь, это прояснится.

29
ответ дан 1 December 2019 в 00:21
поделиться
>    public List<Object> getList()

Почему вы возвращаете List ? Вы также можете вернуть List (без универсальных типов), поскольку это эквивалентно, но заставит работать следующий код:

LinkedList<Customer> theList = new LinkedList<Customer>();

public List getList() {
    return theList;
}

Преобразование между списками с разными универсальными типами сложно и здесь кажется ненужным.

Конечно, вы должны возвращать тип List <Заказчик> ...

1
ответ дан 1 December 2019 в 00:21
поделиться

Вы должны вернуть List из вашего метода. Интуитивно getList () возвращает список, так что вызывающий может получить элементы внутри. List (который эквивалентен List ) допускает эту функциональность. Однако вы не сможете ничего добавить в него через возвращенный список, потому что это не будет типобезопасным; но я не думаю, что это то, что вам нужно.

public List<?> getList()
{
    return theList;
}
0
ответ дан 1 December 2019 в 00:21
поделиться

LinkedList implements List, so you can implement

List< String > list1 = new LinkedList< String >(); 

Or do you want to cast from LinkedList< String > to List< int >? in this case you have to pick every single element and convert it to an integer.

0
ответ дан 1 December 2019 в 00:21
поделиться

List is an interface, LinkedList is a concrete implementation of that interface. Much of the time an implicit cast will work, assign a LinkedList to a List, or pass it to a function expecting a List and it should just `work'.

An explicit cast can also be done if necessary.

//This is valid
List<Customer> myList = new LinkedList<Customer>();

//Also Valid
List<Customer> myList = (List<Customer>) new LinkedList<Customer>();
-1
ответ дан 1 December 2019 в 00:21
поделиться
Другие вопросы по тегам:

Похожие вопросы: