2012-01-09 8 views
10

Estoy intentando compilar código como el siguiente usando JDK1.5.0_u22. Obtengo dos errores de compilación (más abajo). Funciona bien con JDK1.6.0u30, pero mi proyecto está restringido a Java 5. También funciona bien si llenan float con la clase de contenedor Float. ¿Alguien sabe lo que está pasando aquí? ¿Un error simple o alguna restricción general sobre el uso de tipos de matrices primitivas en situaciones genéricas?¿Qué hay de malo con el uso de una matriz primitiva como un parámetro de tipo real en Java 5?

import java.util.*; 
public class A { 
    public static void main(String[] args) { 
    List<float[]> list = Arrays.asList(new float[1], new float[3]); 
    float[] key = new float[2]; 
    int index = Collections.binarySearch(list, key, new Comparator<float[]>() { 
     public int compare(float[] f1, float[] f2) { 
      return f1.length - f2.length; 
     } 
    }); 
    System.out.println(index); 
    } 
} 

errores de compilación:

C:\Users\mravn\Desktop>"c:\Program Files\Java\jdk1.5.0_22"\bin\javac A.java 
A.java:4: incompatible types 
found : java.util.List<<nulltype>[]> 
required: java.util.List<float[]> 
     List<float[]> list = Arrays.asList(new float[1], new float[3]); 
            ^
A.java:6: cannot find symbol 
symbol : method binarySearch(java.util.List<float[]>,float[],<anonymous java.util.Comparator<float[]>>) 
location: class java.util.Collections 
    int index = Collections.binarySearch(list, key, new Comparator<float[]>() { 
          ^
2 errors 

C:\Users\mravn\Desktop> 
+0

http://stackoverflow.com/questions/788433/can-you-pass-an-int-array-to-a-generic-method-in-java Esto podría darle alguna idea –

+0

He copiado su código como está y podría compilarlo y ejecutarlo sin errores en jdk1.5.0_22. – r3nj1

+0

Extraño. ¿Usaste el javac provisto por Oracle? Usando eclipse, funciona para mí. – mravn

Respuesta

7

voy a dar la respuesta a la primera de error del compilador y seguir investigando para ver si puedo encontrar el uno para el error segunda compilador ...

la ejecución regular de por sí no produce errores utilizando jdk1 .5.0_22:

System.out.println(Arrays.asList(new float[1]).size()); 

la ejecución de este por sí mismo ...

System.out.println(Arrays.asList(new float[1], new float[3]).size()); 

produce este error del compilador desagradable ...

An exception has occurred in the compiler (1.5.0_22). Please file a bug at the Java Developer Connection (http://java.sun.com/webapps/bugreport) after checking the Bug Parade for duplicates. Include your program and the following diagnostic in your report. Thank you. 
java.lang.AssertionError: unexpected type: <nulltype> 
     at com.sun.tools.javac.tree.TreeMaker.Type(TreeMaker.java:531) 
     at com.sun.tools.javac.tree.TreeMaker.Type(TreeMaker.java:525) 
     at com.sun.tools.javac.comp.Lower.boxArgs(Lower.java:2510) 
     at com.sun.tools.javac.comp.Lower.visitApply(Lower.java:2420) 
     at com.sun.tools.javac.tree.Tree$Apply.accept(Tree.java:813) 
     at com.sun.tools.javac.comp.Lower.translate(Lower.java:1881) 
     at com.sun.tools.javac.comp.Lower.visitSelect(Lower.java:3019) 
     at com.sun.tools.javac.tree.Tree$Select.accept(Tree.java:987) 
     at com.sun.tools.javac.comp.Lower.translate(Lower.java:1881) 
     at com.sun.tools.javac.comp.Lower.visitApply(Lower.java:2474) 
     at com.sun.tools.javac.tree.Tree$Apply.accept(Tree.java:813) 
     at com.sun.tools.javac.comp.Lower.translate(Lower.java:1881) 
     at com.sun.tools.javac.comp.Lower.translate(Lower.java:1893) 
     at com.sun.tools.javac.comp.Lower.boxArgs(Lower.java:2517) 
     at com.sun.tools.javac.comp.Lower.visitApply(Lower.java:2420) 
     at com.sun.tools.javac.tree.Tree$Apply.accept(Tree.java:813) 
     at com.sun.tools.javac.comp.Lower.translate(Lower.java:1881) 
     at com.sun.tools.javac.tree.TreeTranslator.visitExec(TreeTranslator.java:227) 
     at com.sun.tools.javac.tree.Tree$Exec.accept(Tree.java:728) 
     at com.sun.tools.javac.comp.Lower.translate(Lower.java:1881) 
     at com.sun.tools.javac.tree.TreeTranslator.translate(TreeTranslator.java:54) 
     at com.sun.tools.javac.tree.TreeTranslator.visitBlock(TreeTranslator.java:145) 
     at com.sun.tools.javac.comp.Lower.visitBlock(Lower.java:2933) 
     at com.sun.tools.javac.tree.Tree$Block.accept(Tree.java:535) 
     at com.sun.tools.javac.comp.Lower.translate(Lower.java:1881) 
     at com.sun.tools.javac.tree.TreeTranslator.visitMethodDef(TreeTranslator.java:129) 
     at com.sun.tools.javac.comp.Lower.visitMethodDefInternal(Lower.java:2267) 
     at com.sun.tools.javac.comp.Lower.visitMethodDef(Lower.java:2186) 
     at com.sun.tools.javac.tree.Tree$MethodDef.accept(Tree.java:478) 
     at com.sun.tools.javac.comp.Lower.translate(Lower.java:1881) 
     at com.sun.tools.javac.comp.Lower.visitClassDef(Lower.java:1989) 
     at com.sun.tools.javac.tree.Tree$ClassDef.accept(Tree.java:434) 
     at com.sun.tools.javac.comp.Lower.translate(Lower.java:1881) 
     at com.sun.tools.javac.comp.Lower.translate(Lower.java:1901) 
     at com.sun.tools.javac.comp.Lower.translateTopLevelClass(Lower.java:3070) 
     at com.sun.tools.javac.main.JavaCompiler.compile(JavaCompiler.java:487) 
     at com.sun.tools.javac.main.Main.compile(Main.java:592) 

Así que seguí el consejo de los compiladores e hice algunas búsquedas en la base de datos de errores de Oracle y encontré el error al buscar "java.lang.AssertionError: unexpected type:". Puede verificarlo aquí: Primitive arrays and varargs inference leads to crash in TreeMaker.Type(TreeMaker.java:531)

El uso de la clase de envoltura de flotador es la solución definitiva que descubrió.

EDITAR - respuesta para el error segunda compilador

creo que el error segunda compilador de un error y me he sometido a la Bug Database

yo era capaz de compilar la lista siguiente, clave y el comparador espontánea sin errores de compilación:

List<float[]> list=new ArrayList<float[]>(); 
list.add(new float[] {0.0f}); 
list.add(new float[] {1.0f}); 

float[] key = new float[2]; 

Comparator<float[]> c = new Comparator<float[]>() { 
    public int compare(float[] f1, float[] f2) { 
     return f1.length - f2.length; 
    } 
}; 

Cuando trato de ejecutar "Collections.binarySearch (lista, llave, c)" con ellos, me sale el error "no puede encontrar símbolo". Si cambio "float" a "Float", compila bien en ambos casos.

creo que la lista, la llave y el comparador he publicado anteriormente cumple el contrato de búsqueda binaria completamente de acuerdo con el Java 5 spec on it

+0

Gracias - resulta que uno puede evitar el primer error simplemente dando una pista al compilador: Arrays. asList (...). Para el segundo error, no he encontrado nada excepto el uso de un comparador con dos moldes (float []) en la implementación del método. – mravn

+0

Sí, leí algo como Arrays. en la base de datos de errores - "Arrays.binarySearch no puede inferir int []" - error id = 5070671 –

0

Una solución alternativa podría ser la de compilar con el JDK 6 y establecer -target 1.5, entonces sería posible ejecutarlo con JDK 1.5.0_22 (trató en una máquina Linux) .

+0

Como dije, funciona bien para mí también usando JDK6. El problema solo aparece con JDK5. No estoy utilizando ningún indicador de compilación, simplemente javac (ver publicación) – mravn

+1

Esto debería ser un comentario en su lugar. –

+0

Está teniendo el problema en Java 5 ... –

0

genéricos no manejan constantemente primitivas. Esto es porque Generics es solo una adición de tiempo de compilación a una sola clase.

Cuestiones relacionadas