Bug in developer preview

Remi Forax forax at univ-mlv.fr
Fri Sep 20 02:34:12 PDT 2013


On 09/20/2013 11:25 AM, Vicente-Arturo Romero-Zaldivar wrote:
> Thanks to you both guys for the bug reports.
>
> I will look into this.
>
> Vicente

It's clearly a bug, it doesn't work if the type of the parameter is 
explicit but it works if the type is implicit,
By example, the following code works:
   list.sort(Comparator.nullsFirst(Comparator.comparing(e -> e.trim())));

Rémi

>
> 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