Java edición del 10 de migración relacionados con la recolección y Genéricos

VIBS:

En la continuación de mi consulta previa en el enlace: Emisión Swing en Java 10 , estoy encontrando unas cuantas cuestiones (destacando sólo los errores), esta vez veo problemas son en su mayoría en la Colección API de Java después de moverse a 10.

A continuación se muestra el error. Quería saber ¿hay algún cambio importante en Java 10 al migrar de Java 8 (desde el punto de vista de la colección / Genéricos).

    [javac] C:\WorkSpace\JAVA10\oswm\rel20.10_Patches\WorkManager\src\com\osm\ui\tree\WMTreeNode.java:159: error: breadthFirstEnumeration() in WMTreeNode cannot override breadthFirstEnumeration() in DefaultMutableTreeNode
    [javac]     public Enumeration<?extends WMTreeNode> breadthFirstEnumeration() {
    [javac]                                             ^
    [javac]   return type Enumeration<? extends WMTreeNode> is not compatible with Enumeration<TreeNode>
    [javac] C:\WorkSpace\JAVA10\oswm\rel20.10_Patches\WorkManager\src\com\osm\ui\tree\WMTreeNode.java:158: error: method does not override or implement a method from a supertype
    [javac]     @Override
    [javac]     ^
    [javac] C:\WorkSpace\JAVA10\oswm\rel20.10_Patches\WorkManager\src\com\osm\ui\tree\WMTreeNode.java:164: error: depthFirstEnumeration() in WMTreeNode cannot override depthFirstEnumeration() in DefaultMutableTreeNode
    [javac]     public Enumeration<?extends WMTreeNode> depthFirstEnumeration() {
    [javac]                                             ^
    [javac]   return type Enumeration<? extends WMTreeNode> is not compatible with Enumeration<TreeNode>
    [javac] C:\WorkSpace\JAVA10\oswm\rel20.10_Patches\WorkManager\src\com\osm\ui\tree\WMTreeNode.java:163: error: method does not override or implement a method from a supertype
    [javac]     @Override
    [javac]     ^

    [javac]                           ^
    [javac] C:\WorkSpace\JAVA10\oswm\rel20.10_Patches\WorkManager\src\com\osm\ui\tree\WMTreeNode.java:298: error: no suitable method found for sort(Vector<TreeNode>)
    [javac]             Collections.sort(children);


[javac] C:\WorkSpace\JAVA10\oswm\rel20.10_Patches\WorkManager\src\com\osm\datamgmt\ui\load\LoadNode.java:90: error: breadthFirstEnumeration() in LoadNode cannot override breadthFirstEnumeration() in DefaultMutableTreeNode
    [javac]     public Enumeration<?extends LoadNode> breadthFirstEnumeration() {
    [javac]                                           ^
    [javac]   return type Enumeration<? extends LoadNode> is not compatible with Enumeration<TreeNode>
    [javac] C:\WorkSpace\JAVA10\oswm\rel20.10_Patches\WorkManager\src\com\osm\datamgmt\ui\load\LoadNode.java:95: error: depthFirstEnumeration() in LoadNode cannot override depthFirstEnumeration() in DefaultMutableTreeNode
    [javac]     public Enumeration<?extends LoadNode> depthFirstEnumeration() {


 [javac]   where T is a type-variable:
    [javac]     T extends Object declared in class Class
    [javac] C:\WorkSpace\JAVA10\oswm\rel20.10_Patches\WorkManager\src\com\osm\automation\plot\CopyCountJobParameterDescriptor.java:113: error: incompatible types: Integer cannot be converted to CAP#1
    [javac]             final boolean outOfRange = (model.getMinimum().compareTo(i) > 0) || (model.getMaximum().compareTo(i) < 0);
    [javac]                                                                      ^
    [javac]   where CAP#1 is a fresh type-variable:
    [javac]     CAP#1 extends Object from capture of ?
    [javac] C:\WorkSpace\JAVA10\oswm\rel20.10_Patches\WorkManager\src\com\osm\automation\plot\CopyCountJobParameterDescriptor.java:113: error: incompatible types: Integer cannot be converted to CAP#1
    [javac]             final boolean outOfRange = (model.getMinimum().compareTo(i) > 0) || (model.getMaximum().compareTo(i) < 0);


    [javac] C:\WorkSpace\JAVA10\oswm\rel20.10_Patches\WorkManager\src\com\osm\datamgmt\ui\load\SnapshotLoadNode.java:48: error: breadthFirstEnumeration() in SnapshotLoadNode cannot override breadthFirstEnumeration() in DefaultMutableTreeNode
    [javac]     public Enumeration<?extends SnapshotLoadNode> breadthFirstEnumeration() {
    [javac]                                                   ^
    [javac]   return type Enumeration<? extends SnapshotLoadNode> is not compatible with Enumeration<TreeNode>
    [javac] C:\WorkSpace\JAVA10\oswm\rel20.10_Patches\WorkManager\src\com\osm\datamgmt\ui\load\SnapshotLoadNode.java:53: error: depthFirstEnumeration() in SnapshotLoadNode cannot override depthFirstEnumeration() in DefaultMutableTreeNode
    [javac]     public Enumeration<?extends SnapshotLoadNode> depthFirstEnumeration() {


    [javac] C:\WorkSpace\JAVA10\oswm\rel20.10_Patches\WorkManager\src\com\osm\datamgmt\ui\favorites\FavoritesTreeNode.java:30: error: breadthFirstEnumeration() in FavoritesTreeNode cannot override breadthFirstEnumeration() in DefaultMutableTreeNode
    [javac]     public Enumeration<?extends FavoritesTreeNode> breadthFirstEnumeration() {
    [javac]                                                    ^
    [javac]   return type Enumeration<? extends FavoritesTreeNode> is not compatible with Enumeration<TreeNode>
    [javac] C:\WorkSpace\JAVA10\oswm\rel20.10_Patches\WorkManager\src\com\osm\datamgmt\ui\favorites\FavoritesTreeNode.java:35: error: depthFirstEnumeration() in FavoritesTreeNode cannot override depthFirstEnumeration() in DefaultMutableTreeNode
    [javac]     public Enumeration<?extends FavoritesTreeNode> depthFirstEnumeration() {


    [javac] C:\WorkSpace\JAVA10\oswm\rel20.10_Patches\WorkManager\src\com\osm\datamgmt\ui\save\SaveNode.java:113: error: breadthFirstEnumeration() in SaveNode cannot override breadthFirstEnumeration() in DefaultMutableTreeNode
    [javac]     public Enumeration<?extends SaveNode> breadthFirstEnumeration() {
    [javac]                                           ^
    [javac]   return type Enumeration<? extends SaveNode> is not compatible with Enumeration<TreeNode>
    [javac] C:\WorkSpace\JAVA10\oswm\rel20.10_Patches\WorkManager\src\com\osm\datamgmt\ui\save\SaveNode.java:118: error: depthFirstEnumeration() in SaveNode cannot override depthFirstEnumeration() in DefaultMutableTreeNode
    [javac]     public Enumeration<?extends SaveNode> depthFirstEnumeration() {
    [javac]                                           ^


   [javac] C:\WorkSpace\JAVA10\oswm\rel20.10_Patches\WorkManager\OSMWebServices\src\java\com\osm\webservices\legacy\util\MessageAttachmentHandler.java:76: error: cannot find symbol
    [javac]                         attachment.setRawContent(new BufferedInputStream(new FileInputStream(file)),
    [javac]              

                 ^

WMTreeNodeestá extendiendo javax.swing.tree.DefaultMutableTreeNode.

Nicolai:

El problema

Si se compara con cuidado el código en DefaultMutableTreeNodeentre Java 8 y 10, se verá que los tipos de retorno se generified:

// Java 8 uses `Enumeration` as a "raw type"
public Enumeration breadthFirstEnumeration() { /*...*/ }

// Java 10 uses `Enumeration` as intended: with a type parameter
public Enumeration<TreeNode> breadthFirstEnumeration() { /*...*/ }

Su código es de este tipo:

public Enumeration<?extends SnapshotLoadNode> breadthFirstEnumeration() { /*...*/ }

Su código se compila en Java 8, debido a la adición de los genéricos a un tipo de prima es posible por razones de compatibilidad. Si bien puede haber problemas (en realidad el mismo que más adelante), los tipos de primas se consideran inseguros todos modos, por lo que estos son de esperar.

Compila desaparece de Java 10, porque la API original desea devolver una Enumeration<TreeNode>, pero su anulación no hacerlo. En su lugar, devuelve un Enumerationde un subtipo. Ahora, para una Enumerationesto no es realmente un problema porque es de sólo lectura (volviendo un tipo más específico es, por supuesto, siempre bien), pero el compilador no sabe que (un método podría aceptar un tipo más específico - que no lo haría estar bien).

Para entender esa última paréntesis en más detalle, asuma que fuera una List<TreeNode>y una List<SnapshotLoadNode>vez. Luego, su API, que se utiliza como una DefaultMutableTreeNode, se obtendrá una lista de las personas que llaman pueden añadir TreeNode-s para. Sin embargo, su clase todavía piensa que tiene una lista de un subtipo y obtendría excepciones elenco de clase - no es bueno. Sin tipos primas en juego, esta falta de seguridad de tipos es inaceptable y por lo tanto el compilador se queja.

La solución

Si DefaultMutableTreeNodeeran mi código que cambiaría breadthFirstEnumerationpara volver Enumeration<? extends TreeNode>(no tengo ni idea, ¿por qué ese no es el caso). Eso haría que su compilación de código.

Dado que no es una opción que parece que tiene que hacer esto:

  • perder la información de tipo más preciso y cambiar los tipos de sustituciones devuelve a Enumeration<TreeNode>
  • si necesita el tipo de retorno más preciso, crear un nuevo método:

    public Enumeration<?extends SnapshotLoadNode>
        breadthFirstEnumerationAsSnapshotLoadNode() { /*...*/ }
    

Supongo que te gusta

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