Как избежать предупреждения при приведении к Generic в этом случае? - PullRequest
0 голосов
/ 19 февраля 2019

Лучший способ избежать этого предупреждения?Есть ли случай / пример, где приведение (T) может провалиться?(Язык Java скомпилирован с Eclipse)

Пример обновлен для справки с ответом Ли: приведение к ошибке неуловимо, используя результат.

interface Test {
}

class Test1 implements Test {
    void doSomething() {}
}
class Test2 implements Test {}

public class TestIterable<T extends Test> implements Iterable<T> {

    final ArrayList<T> result=new ArrayList<>();

    public TestIterable(Object obj) {
        if (obj instanceof Test) {
            Test t = (Test) obj;
            result.add((T) obj); // Warning: unchecked cast from Test to T
            // Iteresting decompilation result....
            // result.add((Test) obj);
        }
    }

    @Override
    public Iterator<T> iterator() {
        return result.iterator();
    }

    public static void main(String[] args) {
        TestIterable<Test1> x = new TestIterable<>(new Test2());
        for (Test1 y :x.result) {
            y.doSomething();
            // java.lang.ClassCastException
        };
    }
}

1 Ответ

0 голосов
/ 19 февраля 2019

Две альтернативы.Естественное решение требует объекта T, вероятно, не соответствует вашим потребностям.Тогда тип T должен быть явно передан, потому что стирание типа делает любую другую конструкцию бессмысленной.

class TestIterable<T extends Test> implements Iterable<T> {

    final List<T> result = new ArrayList<>();

    public TestIterable(T obj) {
        result.add(obj);
    }

    public TestIterable(Class<T> type, Object obj) {
        if (obj == null || type.isAssignableFrom(obj.getClass())) {
            result.add(type.cast(obj));
        }
    }

    @Override
    public Iterator<T> iterator() {
        return result.iterator();
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...