Bug in developer preview
Zhong Yu
zhong.j.yu at gmail.com
Thu Sep 19 20:15:48 PDT 2013
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