[patterns] Unchecked cast warning is absent?
Gavin Bierman
gavin.bierman at oracle.com
Tue Oct 3 09:32:26 UTC 2017
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