Небезопасный универсальный бросок при десериализации Набора

внутренний узел или внутренний узел являются любым узлом дерева, которое имеет дочерние узлы и является таким образом не вершиной. Промежуточный узел между корнем и вершинами называют внутренним узлом.

Источник: http://en.wikipedia.org/wiki/Tree_data_structure

6
задан Steven Schlansker 22 October 2009 в 21:03
поделиться

3 ответа

You cannot handle this situation in an entirely type-safe way using only the Java language.

Because this is something that has to be done repeatedly and you can't really get around it, I suggest using a genreic method to and to read and cast generic objects:

@SuppressWarnings("unchecked")
public static <T> T readObject(
    ObjectInputStream in
) throws IOException, ClassNotFoundException {
    return (T)in.readObject();
}

However, I suggest that you don't generally use methods like this to suppress valid warnings.

2
ответ дан 17 December 2019 в 04:48
поделиться

На самом деле нет никакого способа сделать это должным образом, потому что информация о типе времени компиляции, которую вы хотите проверить (например, String ), недоступна во время выполнения (т.е. когда приведение действительно происходит) посредством процесса, известного как стирание . Я думаю, что лучший способ для вас - передать вашу десериализованную коллекцию через специальную «проверку»:

Map<?,?> conf = deserialize(rsrc);
Map<String, String> checked = checkMap(conf, String.class, String.class);
//can use checked freely

где:

@SuppressWarnings("unchecked")
public static <K, V> Map<K,V> checkMap(Map<?,?> map, Class<? extends K> k, Class<? extends V> v) {
    for (Map.Entry<?, ?> e : map) {
        k.cast(e.getKey());   //will throw ClassCastException
        v.cast(e.getValue());
    }
    return (Map<K,V>) map; //unchecked 
}
2
ответ дан 17 December 2019 в 04:48
поделиться

Основываясь на предыдущем ответе, я обычно иду немного дальше при подавлении предупреждений. Я поместил аннотацию к локальной переменной вместо метода, чтобы уменьшить область подавления. Это означает, что, если кто-нибудь придет и дополнит метод позже, непреднамеренного подавления не будет. Он добавляет еще одну строку кода, но я думаю, что компромисс того стоит.

public static <T> T readObject(
    ObjectInputStream in
) throws IOException, ClassNotFoundException {
    @SuppressWarnings("unchecked")
    T val = (T)in.readObject();
    return val;
}

К сожалению, вы не можете добавить аннотацию к выражению (по крайней мере, пока).

1
ответ дан 17 December 2019 в 04:48
поделиться
Другие вопросы по тегам:

Похожие вопросы: