Bug in developer preview

Vicente-Arturo Romero-Zaldivar vicente.romero at oracle.com
Fri Sep 20 02:25:17 PDT 2013


Thanks to you both guys for the bug reports.

I will look into this.

Vicente

On 20/09/13 04:15, Zhong Yu wrote:
> While playing around with the bug report, I found this simple code
> that doesn't compile
>
>          List<String> list = new ArrayList<>();
>          list.sort(nullsFirst(comparing((String e) -> e.trim())));
>
> java: incompatible types: cannot infer type-variable(s) T,U
>      (argument mismatch;
> java.util.function.Function<java.lang.String,capture#1 of ? extends
> java.lang.String> cannot be converted to java.util.function.Function<?
> super java.lang.Object,? extends java.lang.String>)
>
> Another bug?
>
> Zhong Yu
>
>
>
> On Thu, Sep 19, 2013 at 8:24 PM, Marcos Antonio
> <marcos_antonio_ps at hotmail.com> wrote:
>> I just created this simple nonsense class to reproduce the problem and the compiler crashed
>> again with the same error. Just place this file in any Project with the last build (b106) and
>> see if the compiler crashes as well.
>>
>> import static java.util.Comparator.comparing;
>> import static java.util.Comparator.nullsFirst;
>>
>> import java.lang.reflect.InvocationTargetException;
>> import java.lang.reflect.Method;
>> import java.util.ArrayList;
>> import java.util.List;
>>
>> public class Abc<T>
>> {
>>      private void abc()
>>      {
>>          List<T> list = new ArrayList<>();
>>          list.sort(nullsFirst(comparing(e -> getValue(e))));
>>      }
>>
>>      @SuppressWarnings("unchecked")
>>      private <V extends Comparable<? super V>> V getValue(T object)
>>      {
>>          try
>>          {
>>              Method m = object.getClass().getMethod("getName");
>>              return (V) m.invoke(object);
>>          }
>>          catch (NoSuchMethodException | SecurityException |
>>                 IllegalAccessException | IllegalArgumentException |
>>                 InvocationTargetException ex)
>>          {
>>              throw new RuntimeException(ex);
>>          }
>>      }
>> }
>>
>> 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