Непроверенный вызов и непроверенное назначение java factory generics - PullRequest
0 голосов
/ 22 мая 2018

Рассмотрим следующий сценарий:

public abstract class A {}

public class B extends A {}

public interface Provider<T extends A> {
    List<String> list(T param);
}

public class ProviderB implements Provider<B> {
    @Override
    public List<String> list(B param) {
        return Collections.singletonList("ProviderB");
    }
}


public class Factory {
    public static Provider get(int x) {
        if (x == 1)
            return new ProviderB();
        throw new RuntimeException("Not supported");
    }
}


public class Main {
    public static void main(String[] args) {
        Provider provider = Factory.get(1);
        A a = new B();
        List<String> result = provider.list(a);
    }
}

В Main на List<String> result = provider.list(a); я получаю:

Unchecked call to list(T) ..
Unchecked assignment java.util.List .. Reason 'provider' has raw type.

Я знаю некоторые базовые вещи о стирании типов в обобщениях.Как бы вы решили предупреждения?

РЕДАКТИРОВАТЬ: На самом деле основной будет выглядеть так:

public static void main(Map<Integer, ? extends A> types) {
        for (Map.Entry<Integer, ? extends A> entryType : types.entrySet()) {
            Provider provider = Factory.get(entryType.getKey());
            List<String> result = provider.list(entryType.getValue());
        }
    }
...