[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