Pergunta

Gostaria de saber se é possível lançar um não-Comparável a algo para que ele corresponde ao método do parâmetro T, que tem tipo de modelo <T extends Comparable<? super T>>, como o Collections.sort() método

public static <T extends Comparable<? super T>> void sort(List<T> list)

Suponha que eu em algum lugar, ter uma referência para a lista de não-Comparáveis e deseja invocar esse método de fundição como este:

List<E> foo = new List<E>(a);
Collections.sort( /* magic cast */ foo);

Eu posso fazer isso se eu converter para (List<? extends Comparable>), mas isso gera um aviso de que eu estou usando matérias-tipos (Comparável sem tipos de modelo, neste caso).Vamos supor que eu queira evitar o uso de matérias-tipos, ou mesmo suprimi-los através de @SuppressWarnings("rawtypes") (e.g.para preservar a compatibilidade com versões anteriores e evitar matérias-tipos).

É possível evitar o uso de matérias-tipos de fundição para a (List<? extends Comparable</*something*/>>) e o que seria esse "algo" (não verificado elenco é aceitável)?

EDITAR:Este exemplo é apenas para ilustrar o ponto.Na verdade eu não tenho um Comparáveis, nem que eu quero para classificar qualquer coisa, mas eu só preciso verificar dinamicamente se algo é ou não de algum tipo (Comparável neste exemplo) (via instanceof) e, em seguida, passar algum argumento para um método que tem os argumentos de modelo semelhante ao Collections.sort() o método.

Foi útil?

Solução

Cast

Collections.sort((List<Comparable<Object>>) list);

Isso não vai dar "rawtype" avisos.Apenas um "desmarcado elenco de" aviso " (que você vai conseguir de qualquer maneira.)

A julgar pelo que você mencionou no EDITAR, afinal, você quer fazer algo como isso?

if(!list.isEmpty() && list.get(0) instanceof Comparable){
    List<Comparable<Object>> cmprList = (List<Comparable<Object>>)list;
    Collections.sort(cmprList);
}

Outras dicas

Esta certamente não é possível. Collections.sort requer a Comparable a fim de chamar a compareTo() o método.Assim, em, quero saber sua opinião, o que deve acontecer quando o tipo é uma coleção de não-objetos comparáveis?

Pode ser que você queira usar algo como um padrão de ordenação, com base nas referências, por exemplo.Mas tal coisa não existe implicitamente.Porém, ele pode ser implementado.Mas eu duvido que isso é o que você quer?Então, por que você deseja classificar a lista em primeiro lugar?E como estes elementos devem ser classificados?

Isto irá compilar no Eclipse:

List<?> foo = new ArrayList<Object>();
Collections.sort((List<Comparable>) foo);

Você vai ter um "Tipo de Segurança:Não verificada" aviso de que você pode suprimir com este:

@SuppressWarnings("unchecked")

Que vai deixar você chamar de classificação.O que você está procurando?Não há garantias de que estará seguro em tempo de execução, é claro.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top