Bug in developer preview

Marcos Antonio marcos_antonio_ps at hotmail.com
Thu Sep 19 07:24:21 PDT 2013


Hello, Vicente. Unfortunately I can't send you the whole class as this class has lots of dependencies in my application and I would need to send you the whole application instead. But maybe trying a simple code like this:

private void sort()
{
    final Comparator<T> ASCENDING_ORDER = nullsFirst(comparing(e -> someGenericMethod(e)));
    _entities.sort(ASCENDING_ORDER);
}

// Just returns the value of some property from the entity that is also Comparable
private <V extends Comparable<? super V>> V someGenericMethod(T entity)
{
    Object value = ...
    return (V) value;
}

would show something.

Sorry to write to just copy my code in Portuguese. I was in a hurry. Here it is in English:

private void sort()
{
     final Comparator<T> ASCENDING_ORDER =
         new Comparator<T>()
         {
             @Override
             public int compare(T entity1, T entity2)
             {
                 Object value1 = getOrderPropertyValue(entity1);
                 Object value2 = getOrderPropertyValue(entity2);
                 return compareValues(value1, value2);
             }
      
             private Object getOrderPropertyValue(T entity)
             {
                 EntityStructure entityStructure =
                     _currentEntityStructures.get(entity);
                 ObjectProperty objectProperty =
                     entityStructure.objectProperties.get(
                    _orderPropertyName);
                 return objectProperty.getValue();
             }

             @SuppressWarnings("unchecked")
             private <V> int compareValue(V value1, V value2)
             {
                 if (value1 != null && value2 != null)
                 {
                     return ((Comparable<V>) value1).compareTo(value2);
                 }
                 else
                 {
                     return value1 == value2 ? 0 : (value1 == null ? 1 : -1);
                 }
             }
     };
    
     _entities.sort(ASCENDING_ORDER);
     // ...
}

Then I tried to convert it to use lambda expression:

private void sort()
{
     final Comparator<T> ASCENDING_ORDER =
         nullsFirst(comparing(e -> getOrderPropertyValue(e)));
    
     _entities.sort(ASCENDING_ORDER);
     // ...
}

@SuppressWarnings("unchecked")
private <V extends Comparable<? super V>> V getOrderPropertyValue(T entity)
{
     EntityStructure entityStructure =
         _currentEntityStructures.get(entity);
     ObjectProperty objectProperty =
         entityStructure.objectProperties.get(
         _orderPropertyName);
     return (V) objectProperty.getValue();
}

Marcos

> Date: Thu, 19 Sep 2013 11:05:24 +0100
> From: vicente.romero at oracle.com
> To: marcos_antonio_ps at hotmail.com
> CC: lambda-dev at openjdk.java.net
> Subject: Re: Bug in developer preview
> 
> Hi Marcos Antonio,
> 
> This seems to be an important bug, but the report is incomplete. Could 
> you please send me the whole class.
> 
> Also as a side comment, I think that using English identifiers makes the 
> code easier to understand by a wider audience, even if you don't speak 
> Portuguese ;)
> 
> Thanks,
> Vicente
> 
> On 19/09/13 02:11, Marcos Antonio wrote:
>> I'm using JDK 8 Developer Preview (b106)
>>
>> First I had this code in a class of mine:
>>
>> private void ordenar()
>> {
>>      final Comparator<T> ORDEM_CRESCENTE =
>>          new Comparator<T>()
>>          {
>>              @Override
>>              public int compare(T entidade1, T entidade2)
>>              {
>>                  Object valor1 = obterValorPropriedadeOrdem(entidade1);
>>                  Object valor2 = obterValorPropriedadeOrdem(entidade2);
>>                  return comparar(valor1, valor2);
>>              }
>>      
>>              private Object obterValorPropriedadeOrdem(T entidade)
>>              {
>>                  EstruturaEntidade estruturaEntidade =
>>                      _estruturasEntidadesAtuais.get(entidade);
>>                  PropriedadeObjeto propriedadeObjeto =
>>                      estruturaEntidade.propriedadesObjetos.get(
>>                      _nomePropriedadeOrdem);
>>                  return propriedadeObjeto.getValor();
>>              }
>>              @SuppressWarnings("unchecked")
>>              private <V> int comparar(V valor1, V valor2)
>>              {
>>                  if (valor1 != null && valor2 != null)
>>                  {
>>                      return ((Comparable<V>) valor1).compareTo(valor2);
>>                  }
>>                  else
>>                  {
>>                      return valor1 == valor2 ? 0 : (valor1 == null ? 1 : -1);
>>                  }
>>              }
>>      };
>>    
>>      _entidades.sort(ORDEM_CRESCENTE);
>>      // ...
>> }
>>
>> Then I tried to convert it to use lambda expression:
>>
>> private void ordenar()
>> {
>>      final Comparator<T> ORDEM_CRESCENTE =
>>          nullsFirst(comparing(e -> obterValorPropriedadeOrdem(e)));
>>    
>>      _entidades.sort(ORDEM_CRESCENTE);
>>      // ...
>> }
>>
>> @SuppressWarnings("unchecked")
>> private <V extends Comparable<? super V>> V obterValorPropriedadeOrdem(T entidade)
>> {
>>      EstruturaEntidade estruturaEntidade =
>>          _estruturasEntidadesAtuais.get(entidade);
>>      PropriedadeObjeto propriedadeObjeto =
>>          estruturaEntidade.propriedadesObjetos.get(
>>          _nomePropriedadeOrdem);
>>      return (V) propriedadeObjeto.getValor();
>> }
>>
>> Now I get this error when I compile:
>>
>>      [javac] An exception has occurred in the compiler (1.8.0-ea). 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.
>>      [javac] java.lang.NullPointerException
>>      [javac]  at com.sun.tools.javac.code.Types$DescriptorCache.get(Types.java:392)
>>      [javac]  at com.sun.tools.javac.code.Types.findDescriptorSymbol(Types.java:563)
>>      [javac]  at com.sun.tools.javac.code.Types.isFunctionalInterface(Types.java:579)
>>      [javac]  at com.sun.tools.javac.code.Types.functionalInterfaceBridges(Types.java:662)
>>      [javac]  at com.sun.tools.javac.comp.LambdaToMethod$LambdaAnalyzerPreprocessor$TranslationContext.<init>(LambdaToMethod.java:1669)
>>      [javac]  at com.sun.tools.javac.comp.LambdaToMethod$LambdaAnalyzerPreprocessor$LambdaTranslationContext.<init>(LambdaToMethod.java:1722)
>>      [javac]  at com.sun.tools.javac.comp.LambdaToMethod$LambdaAnalyzerPreprocessor.makeLambdaContext(LambdaToMethod.java:1618)
>>      [javac]  at com.sun.tools.javac.comp.LambdaToMethod$LambdaAnalyzerPreprocessor.visitLambda(LambdaToMethod.java:1213)
>>      [javac]  at com.sun.tools.javac.tree.JCTree$JCLambda.accept(JCTree.java:1619)
>>      [javac]  at com.sun.tools.javac.tree.TreeTranslator.translate(TreeTranslator.java:58)
>>      [javac]  at com.sun.tools.javac.tree.TreeTranslator.translate(TreeTranslator.java:70)
>>      [javac]  at com.sun.tools.javac.tree.TreeTranslator.visitApply(TreeTranslator.java:275)
>>      [javac]  at com.sun.tools.javac.tree.JCTree$JCMethodInvocation.accept(JCTree.java:1459)
>>      [javac]  at com.sun.tools.javac.tree.TreeTranslator.translate(TreeTranslator.java:58)
>>      [javac]  at com.sun.tools.javac.tree.TreeTranslator.translate(TreeTranslator.java:70)
>>      [javac]  at com.sun.tools.javac.tree.TreeTranslator.visitApply(TreeTranslator.java:275)
>>      [javac]  at com.sun.tools.javac.tree.JCTree$JCMethodInvocation.accept(JCTree.java:1459)
>>      [javac]  at com.sun.tools.javac.tree.TreeTranslator.translate(TreeTranslator.java:58)
>>      [javac]  at com.sun.tools.javac.tree.TreeTranslator.visitVarDef(TreeTranslator.java:153)
>>      [javac]  at com.sun.tools.javac.comp.LambdaToMethod$LambdaAnalyzerPreprocessor.visitVarDef(LambdaToMethod.java:1381)
>>      [javac]  at com.sun.tools.javac.tree.JCTree$JCVariableDecl.accept(JCTree.java:846)
>>      [javac]  at com.sun.tools.javac.tree.TreeTranslator.translate(TreeTranslator.java:58)
>>      [javac]  at com.sun.tools.javac.tree.TreeTranslator.translate(TreeTranslator.java:70)
>>      [javac]  at com.sun.tools.javac.tree.TreeTranslator.visitBlock(TreeTranslator.java:162)
>>      [javac]  at com.sun.tools.javac.comp.LambdaToMethod$LambdaAnalyzerPreprocessor.visitBlock(LambdaToMethod.java:1123)
>>      [javac]  at com.sun.tools.javac.tree.JCTree$JCBlock.accept(JCTree.java:903)
>>      [javac]  at com.sun.tools.javac.tree.TreeTranslator.translate(TreeTranslator.java:58)
>>      [javac]  at com.sun.tools.javac.tree.TreeTranslator.visitMethodDef(TreeTranslator.java:145)
>>      [javac]  at com.sun.tools.javac.comp.LambdaToMethod$LambdaAnalyzerPreprocessor.visitMethodDef(LambdaToMethod.java:1233)
>>      [javac]  at com.sun.tools.javac.tree.JCTree$JCMethodDecl.accept(JCTree.java:772)
>>      [javac]  at com.sun.tools.javac.tree.TreeTranslator.translate(TreeTranslator.java:58)
>>      [javac]  at com.sun.tools.javac.tree.TreeTranslator.translate(TreeTranslator.java:70)
>>      [javac]  at com.sun.tools.javac.tree.TreeTranslator.visitClassDef(TreeTranslator.java:134)
>>      [javac]  at com.sun.tools.javac.comp.LambdaToMethod$LambdaAnalyzerPreprocessor.visitClassDef(LambdaToMethod.java:1160)
>>      [javac]  at com.sun.tools.javac.tree.JCTree$JCClassDecl.accept(JCTree.java:687)
>>      [javac]  at com.sun.tools.javac.tree.TreeTranslator.translate(TreeTranslator.java:58)
>>      [javac]  at com.sun.tools.javac.comp.LambdaToMethod$LambdaAnalyzerPreprocessor.analyzeAndPreprocessClass(LambdaToMethod.java:1113)
>>      [javac]  at com.sun.tools.javac.comp.LambdaToMethod$LambdaAnalyzerPreprocessor.access$300(LambdaToMethod.java:1083)
>>      [javac]  at com.sun.tools.javac.comp.LambdaToMethod.visitClassDef(LambdaToMethod.java:218)
>>      [javac]  at com.sun.tools.javac.tree.JCTree$JCClassDecl.accept(JCTree.java:687)
>>      [javac]  at com.sun.tools.javac.tree.TreeTranslator.translate(TreeTranslator.java:58)
>>      [javac]  at com.sun.tools.javac.comp.LambdaToMethod.translate(LambdaToMethod.java:183)
>>      [javac]  at com.sun.tools.javac.comp.LambdaToMethod.translate(LambdaToMethod.java:176)
>>      [javac]  at com.sun.tools.javac.comp.LambdaToMethod.translateTopLevelClass(LambdaToMethod.java:203)
>>      [javac]  at com.sun.tools.javac.main.JavaCompiler.desugar(JavaCompiler.java:1465)
>>      [javac]  at com.sun.tools.javac.main.JavaCompiler.desugar(JavaCompiler.java:1350)
>>      [javac]  at com.sun.tools.javac.main.JavaCompiler.compile2(JavaCompiler.java:900)
>>      [javac]  at com.sun.tools.javac.main.JavaCompiler.compile(JavaCompiler.java:859)
>>      [javac]  at com.sun.tools.javac.main.Main.compile(Main.java:523)
>>      [javac]  at com.sun.tools.javac.main.Main.compile(Main.java:381)
>>      [javac]  at com.sun.tools.javac.main.Main.compile(Main.java:370)
>>      [javac]  at com.sun.tools.javac.main.Main.compile(Main.java:361)
>>      [javac]  at com.sun.tools.javac.Main.compile(Main.java:64)
>>      [javac]  at com.sun.tools.javac.Main.main(Main.java:50)
>>
>> Sorry if I can't give you a simpler example, but I think you can come up with something simple and similar.
>>
>> Marcos 		 	   		
>>
> 		 	   		  


More information about the lambda-dev mailing list