Bug in developer preview
Vicente-Arturo Romero-Zaldivar
vicente.romero at oracle.com
Tue Sep 24 02:30:27 PDT 2013
On 20/09/13 10:34, Remi Forax wrote:
> 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
Hi all,
I have created the following bug entry to track this issue:
https://bugs.openjdk.java.net/browse/JDK-8025290
Thanks,
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)https://bugs.openjdk.java.net/browse/JDK-8025290
>>>>>> [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