[patterns] Unchecked cast warning is absent?

Remi Forax forax at univ-mlv.fr
Tue Oct 3 08:16:09 UTC 2017


Maurizio,
__matches <=> instanceof + cast,
the instanceof part is currently illegal, so the implication is that __matches should be illegal too.

Rémi

----- Mail original -----
> De: "Maurizio Cimadamore" <maurizio.cimadamore at oracle.com>
> À: "Tagir Valeev" <amaembo at gmail.com>, "amber-dev" <amber-dev at openjdk.java.net>
> Envoyé: Mardi 3 Octobre 2017 10:12:11
> Objet: Re: [patterns] Unchecked cast warning is absent?

> I don't think you want to disallow. It's same as cast - you can do
> 
> (T)obj
> 
> Which is a no-op, and you get an unchecked warning for it. If T has some
> more interesting bound, the cast is not a no-op.
> 
> Maurizio
> 
> 
> On 03/10/17 05:28, Tagir Valeev wrote:
>> It's even more interesting that method type parameter is allowed in __matches:
>>
>>    static <T> void matches(Object obj) {
>>      if(obj __matches T t) {
>>        System.out.println("Matches!");
>>      }
>>    }
>>
>> Bytecode shows that "instanceof Object" is generated which is pretty
>> useless. I think, such construct should be disabled and result in
>> compilation error (similarly to instanceof).
>>
>> With best regards,
>> Tagir Valeev.
>>
>> On Mon, Oct 2, 2017 at 4:45 PM, Tagir Valeev <amaembo at gmail.com> wrote:
>>> Hello!
>>>
>>> Just tried to play with pattern matching implementation. Seems that
>>> the matching against a non-reifiable type is unsafe, which is
>>> expected. Should the warning be displayed in this case?
>>>
>>> E.g.:
>>>
>>> import java.util.*;
>>>
>>> public class ListTest {
>>>
>>>    static void matches(Object obj) {
>>>      if(obj __matches List<String> list) {
>>>        System.out.println(list.get(0));
>>>      }
>>>    }
>>>
>>>    public static void main(String[] args) {
>>>      matches(Collections.singletonList(1));
>>>    }
>>> }
>>>
>>> $ ~/j/bin/javac -Xlint:all ListTest.java
>>> (compilation successful, no warning)
>>> $ ~/j/bin/java ListTest
>>> Exception in thread "main" java.lang.ClassCastException:
>>> java.base/java.lang.Integer cannot be cast to
>>> java.base/java.lang.String
>>> at ListTest.matches(ListTest.java:7)
>>> at ListTest.main(ListTest.java:12)
>>>
>>> With best regards,
> >> Tagir Valeev.


More information about the amber-dev mailing list