Не проверено приведение в Java при приведении к списку суперклассов - PullRequest
2 голосов
/ 19 декабря 2010

В моей Java-программе мне нужно привести объект типа List<? extends SomeBaseClass> к List<SomeBaseClass>.Если я произвожу это непосредственно, компилятор жалуется (показывает предупреждение), что есть непроверенное приведение.Хотя я могу быть уверен, что все объекты могут быть преобразованы в их суперкласс, компилятор не замечает этого и сообщает о непроверенном приведении.Как я могу избавиться от предупреждения?Есть ли другой способ, кроме @SupressWarnings («unchecked»)?

PS: Код работает нормально, мне просто интересно, есть ли лучший способ сделать что-либо.1007 *

Решение: этот тип заклинания следует выполнять только в том случае, если он уверен, что не изменит список в будущем.Но лучше отбрасывать отдельные объекты, когда мы убираем их из списка.

Ответы [ 3 ]

7 голосов
/ 19 декабря 2010

Компилятор жалуется, поскольку, если вы добавите объект типа SomeBaseClass в свой список List<SomeBaseClass>, вы можете «нарушить» содержимое списка List<? extends SomeBaseClass>.

Вот пример, когда Number фигурирует как SomeBaseClass:

List<? extends Number> doubles = new ArrayList<Double>();
List<Number> nums = (List<Number>) doubles;

nums.add(new Integer(5));    // no compiler complaints here...

// doubles now contains an Integer value!

Если в вашем случае нет способа обойти это, я считаю, что @SuppressWarnings("unchecked") - ваш лучший вариант здесь.

1 голос
/ 19 декабря 2010

То, что вы пытаетесь сделать, небезопасно.Рассмотрим простой пример:

import java.util.*;

class SomeBaseClass
{
}

class SomeSubClass extends SomeBaseClass
{
    public static void main(String[] a)
    {
        List<SomeSubClass> orig = new ArrayList<SomeSubClass>();
        // Compiles with no warnings.  This is the purpose of the ? extends syntax
        List<? extends SomeBaseClass> l1 = orig;
        // This is what you're trying to do
        List<SomeBaseClass> l2 = (List<SomeBaseClass>) l1;
        // Then, we add a SomeBaseClass to the new list
        l2.add(new SomeBaseClass());
        // ClassCastException, since this casts a SomeBaseClass to a SomeSubClass
        SomeSubClass first = orig.get(0);
    }
}
0 голосов
/ 19 декабря 2010

Вы удручены, что является плохой практикой.Попробуйте реорганизовать свой код, чтобы избежать этого приведения.И, конечно, в этом случае не следует подавлять предупреждения.

...