Eu tenho uma interface de iterador personalizada
public interface ThrowingIterator<T, E extends Throwable> {
// matches interface of standard Iterator, but next() and hasNext() can throw E
}
e uma implementação
public class CustomIterator implements ThrowingIterator<List<MyType>, IOException> {
// ...
public CustomIterator() {
// ...
}
public static ThrowingIterator<List<MyType>, IOException> helperFactory() {
// ...
}
}
onde class MyType implements MyInterface
. O problema que tenho está na seguinte função:
ThrowingIterator<List<? extends MyInterface>, IOException> getIterator() {
if (someCondition) {
return new CustomIterator();
}
return CustomIterator.helperFactory();
}
O compilador está apresentando erros em ambas as instruções de retorno, por motivos diferentes. Intellij fornece o seguinte:
// first
Required: ThrowingIterator<List<? extends MyInterface>, IOException>
Provided: CustomIterator
// second
Required: ThrowingIterator<List<? extends MyInterface>, IOException>
Provided: ThrowingIterator<List<MyType>, IOException>
Pelo que eu sei, CustomIterator
deve caber no que é necessário, já que o tipo para o qual ele implementa ThrowingIterator
se ajusta dentro dos limites do curinga (especialmente olhando para o segundo caso, já que MyType implements MyInterface
, que é o que eu pensei ser exatamente o que está tentando? extends MyInterface
capturar). esse problema de genéricos seja resolvido minimizando a quantidade de curingas nas declarações/assinaturas? A assinatura de getIterator()
está correta como está. Também entendo que fornecer um iterador em uma lista é uma má prática; correção que é tratada em outro lugar.
Seu método
getIterator
não compila porque, por padrão, os genéricos do Java são invariantes.O que isso significa é que mesmo que a
List<MyType>
seja um subtipo deList<? extends MyInterface>
, a nãoThrowingIterator<List<MyType>, IOException>
é um subtipo de .ThrowingIterator<List<? extends MyInterface>, IOException>
Isso ocorre pelo mesmo motivo que
List<MyType>
não é um subtipo deList<MyInterface>
- os genéricos do Java são invariantes. Você já criou essa covariante adicionando? extends
, resultando emList<? extends MyInterface>
. Agora você só precisa fazer isso de novo, porque adicionou outra camada de genéricos que ainda é invariável.Adicione
? extends
novamente:Isso irá satisfazer o IntelliJ e o compilador Java.