Digamos que estou implementando um conjunto ordenado em Java com um <T>
, como uma árvore de busca binária. O conjunto usa a Comparator<T>
para ordenar seus elementos. Para simplificar, vamos assumir que o comparador é sempre definido.
A maioria das coleções define contains(Object)
, onde o argumento é do tipo Object
e não do tipo genérico da coleção T
.
Como um método como esse é implementado? Você não pode usar o comparador no argumento, porque você não sabe o tipo do argumento. Você não pode nem verificar se um cast é permitido.
Só consigo imaginar duas soluções, ambas ruins:
- O conjunto tem que ser criado com um
Class<T>
objeto para que eu possa verificar se o argumento pode ser convertido. Mas claramente o framework de coleções do Java não requer isso, então deve haver uma maneira de contornar isso. - Apenas faça o elenco e pegue o
ClassCastException
que pode resultar. Isso parece nojento.
Você pode ver por si mesmo em
TreeMap.getEntryUsingComparator
.Spoiler: começa com
Então ele será lançado
ClassCastException
como dito no JavaDoc (obrigado @yshavit).