[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