[patterns] Unchecked cast warning is absent?

Tagir Valeev amaembo at gmail.com
Tue Oct 3 09:47:11 UTC 2017


I agree that making instanceof more liberal is a possibility. In
particular, it might be allowed to use any type operand, which is
safe, if used in subsequent cast (produces no unchecked warning).
Allowing `x instanceof ArrayList<String>` seems a good idea.

With best regards,
Tagir Valeev.

On Tue, Oct 3, 2017 at 4:32 PM, Gavin Bierman <gavin.bierman at oracle.com> wrote:
> Maurizio beat me to it! As he says, one very useful use of pattern matching is a type-switch. So we’re experimenting with a more liberal treatment of types in the type test patterns. There are a few rough edges and obviously better warnings required, but it would be very helpful to get thoughts on this. Of course, we could perhaps consider making instanceof more liberal - would you be happy as long as we kept an invariant that __matches <=> instanceof + cast?
>
> Gavin
>
>> On 3 Oct 2017, at 09:57, Maurizio Cimadamore <maurizio.cimadamore at oracle.com> wrote:
>>
>>
>>
>> On 03/10/17 09:16, Remi Forax wrote:
>>> Maurizio,
>>> __matches <=> instanceof + cast,
>>> the instanceof part is currently illegal, so the implication is that __matches should be illegal too.
>> From a code gen perspective I agree with you. From a type checking perspective I don't otherwise you would make pattern matching incompatible with generics:
>>
>> List<String> ls = ...
>> if (x matches ArrayList<String> a) {
>>   ...
>> } else if (x matches LinkedList<String> ll) {
>>   ...
>> }
>>
>> I think accepting programs such as these is useful (and actually the above is not even an unsafe program!). But, using your strict interpretation, I can't do an instanceof whose target type is ArrayList<String> - so this should be rejected?
>>
>> I think instanceof makes sense to describe what the generated code should do - but I believe applying the same type checking rules you have for instanceof would result in overly restrictive semantics.
>>
>> Maurizio
>>>
>>> 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