[patterns] Unchecked cast warning is absent?

Maurizio Cimadamore maurizio.cimadamore at oracle.com
Tue Oct 3 08:12:11 UTC 2017


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