Джава:Безопасность типов — непроверенное приведение

StackOverflow https://stackoverflow.com/questions/1490134

  •  18-09-2019
  •  | 
  •  

Вопрос

Вот мой код:

Object[] data = GeneComparison.readData(files);
MyGenome genome = (MyGenome) data[0];
LinkedList<Species> breeds = (LinkedList<Species>) data[1];

Это предупреждение для LinkedList:

Type safety: Unchecked cast from Object to LinkedList<Species>

Почему он жалуется на связанный список, а не на MyGenome?

Это было полезно?

Решение

Потому что здесь:

MyGenome genome = (MyGenome) data[0];

Вы не используете дженерики

И здесь

LinkedList<Species> breeds = (LinkedList<Species>) data[1];

Вы их используете.

Это просто предупреждение, вы смешиваете типы в массиве данных.Если вы знаете, что делаете (я имею в виду, если второй элемент содержит Связанный список ) вы можете игнорировать предупреждение.

Но лучше было бы иметь такой объект:

class Anything {
    private Object [] data;
    public Anything( Object [] data ) {
         this.data = data;
    }
    public Gnome getGnome() {
    .....
    }
    public List<Species> getBreeds() {
    ......
    }
 }

И вам придется использовать методы, возвращающие правильные вещи, до правильного преобразования, чтобы в итоге вы получили:

Anything anything = new Anything( GeneComparison.readData(files) );
MyGenome genome             = anything.getGnome(); // similar to data[0]
LinkedList<Species> breeds = anything.getBreeds(); // similar to data[1];

Внутри этих методов вам нужно выполнить правильные преобразования.

Другие советы

Java жалуется подобным образом, когда вы приводите непараметризованный тип (Object) к параметризованному типу (LinkedList).Я хочу сказать вам, что это может быть что угодно.На самом деле это ничем не отличается от первого приведения, за исключением того, что первое генерирует исключение ClassCastException, если оно не того типа, а второе — нет.

Все сводится к стиранию типа.LinkedList во время выполнения на самом деле представляет собой просто LinkedList.Вы можете поместить в него что угодно, и оно не будет генерировать исключение ClassCastException, как в первом примере.

Часто, чтобы избавиться от этого предупреждения, вам нужно сделать что-то вроде:

@SuppressWarning("unchecked")
public List<Something> getAll() {
  return getSqlMapClient.queryForList("queryname");
}

где queryForList() возвращает список (непараметризованный), содержимое которого, как вы знаете, будет относиться к классу Something.

Другой аспект заключается в том, что массивы в Java ковариантный, что означает, что они сохраняют информацию о типе времени выполнения.Например:

Integer ints[] = new Integer[10];
Object objs[] = ints;
objs[3] = "hello";

выдаст исключение.Но:

List<Integer> ints = new ArrayList<Integer>(10);
List<Object> objs = (List<Object>)ints;
objs.add("hello");

совершенно законно.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top