genéricos de Java cambian en el campo de la clase y la serialización

Jean Valjean:

Tengo una pregunta serialización de Java que no se informó ni negada como problemática en Java Docs (para JDK8 ).

Así, supongamos que tengo una clase que implementa Serializable

private static final long serialVersionUID = 1L;

private List<CharSequence> values;

Si cambio valuesde

private List<String> values;

debería cambiar el serialVersionUID?

Andy Turner:

Otra forma de pensar de esta operación de serialización / deserialización es que es un poco como la fundición.

Se puede emitir una List<CharSequence>a una List<String>? No directamente: el compilador se detendrá, porque los genéricos son invariantes. Puede forzar a que, sin embargo:

List<String> list = (List<String>) (List<?>) listOfCharSequences;
String entry = list.get(0);

y esto podría trabajar una gran parte del tiempo, ya que, Stringes el más común CharSequence.

Pero es posible que haya algo más ahí, que es una CharSequence, pero no String, por ejemplo, una StringBuilder. El código anterior se estrellaría con una ClassCastException.

Por lo tanto, si usted puede estar seguro de que todos sus CharSequences son realmente Stringes, es seguro para hacer este cambio. De lo contrario, debe protegerse, ya sea en contra de ella, cambiando la versión de serie de identificación; o, en el caso de String, simplemente podría invocar toString()en todos los elementos:

List<String> listOfStrings = listOfCharSequences.stream()
    .map(cs -> Objects.toString(cs, null))
    .collect(toList())

( String.toString()Mismo vuelve, por lo que este no volverían nueva instancia de elementos que ya están Strings)

Supongo que te gusta

Origin http://43.154.161.224:23101/article/api/json?id=227045&siteId=1
Recomendado
Clasificación