внутренний узел или внутренний узел являются любым узлом дерева, которое имеет дочерние узлы и является таким образом не вершиной. Промежуточный узел между корнем и вершинами называют внутренним узлом.
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.
На самом деле нет никакого способа сделать это должным образом, потому что информация о типе времени компиляции, которую вы хотите проверить (например, 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
}
Основываясь на предыдущем ответе, я обычно иду немного дальше при подавлении предупреждений. Я поместил аннотацию к локальной переменной вместо метода, чтобы уменьшить область подавления. Это означает, что, если кто-нибудь придет и дополнит метод позже, непреднамеренного подавления не будет. Он добавляет еще одну строку кода, но я думаю, что компромисс того стоит.
public static <T> T readObject(
ObjectInputStream in
) throws IOException, ClassNotFoundException {
@SuppressWarnings("unchecked")
T val = (T)in.readObject();
return val;
}
К сожалению, вы не можете добавить аннотацию к выражению (по крайней мере, пока).