raw types warnings and instanceof
Maurizio Cimadamore
Maurizio.Cimadamore at Sun.COM
Mon Nov 3 04:14:35 PST 2008
Hi
I've just started a poll on my blog; should you find other weird cases
of raw warnings incorrectly (or I should say redundantly) being
generated by javac - please post them in my blog. Here's the URL:
http://blogs.sun.com/mcimadamore/entry/diagnosing_raw_types
Currently on the list:
*) Remove raw warnings for cast/instanceof
*) Add special case for Class<RAWTYPE>
Thanks to everyone for all the comments on this issue and for your
effort in making javac a better compiler.
Maurizio
Maurizio Cimadamore wrote:
> Hi
> FYI here's the warning I found when cleaning up langtools; as I said
> there are only two warnings that cannot be fixed - both of the same
> kind; both warnings are generated by the following code pattern:
>
> Class<?> token;
> Object value = Enum.valueOf((Class)token, "");
>
> Since Enum.valueof is a generic method declaring an fbound (<T extends
> Enum<T>>) , it's not possible to find an instantiation for the
> type-parameter T without going through an unchecked method call. In
> fact, all possible kinds of checked call will result in a compile-time
> error. The only way to remove this warning is to have some type that
> could be used for parameterizing the 'Class' in the cast.
>
> Class<?> token;
> Object value = Enum.valueOf((Class<T>)token, '');
>
> The problem is that, obviously, we don't always have such a T so that
> this warning could be unavoidable.
> Maurizio
>
> Rémi Forax wrote:
>> Martin Buchholz a écrit :
>>> Here's another case where raw type warnings seem
>>> well-intentioned, but going too far.
>>>
>>> $ cat ClassRaw.java; jver coll jr ClassRaw
>>> public class ClassRaw {
>>> public static void main(String[] args) throws Throwable {
>>> Class<Comparable> x = Comparable.class;
>>> }
>>> }
>>> ==> javac -Xlint:all ClassRaw.java
>>> ClassRaw.java:3: warning: [raw-type] found raw type:
>>> java.lang.Comparable
>>> missing type parameters for generic class java.lang.Comparable<T>
>>> Class<Comparable> x = Comparable.class;
>>> ^
>>> 1 warning
>>>
>>> My first impression is that these warnings are more verbose,
>>> more annoying, and less likely to find bugs than even "unchecked",
>>> and that even pedants like myself will change their scripts to do
>>> -Xlint:all,-rawtypes instead of -Xlint:all
>>>
>>> Martin
>>>
>> The problem with Class<Comparable> is that it's a rare type, a mix
>> between parameterized type
>> and raw type and you clearly want to detect them, by example a use of
>> List<List>> should raise a warning.
>>
>> In my opinion, there is two way to solve the problem:
>> 1) change the JLS to use wildcard instead of raw type in getClass()
>> and .class,
>> this require to add an unsafe conversion between a rare type and
>> its equivalent using a wildcard
>> to avoid to emit an error in code that compile with prevous version.
>> 2) Have a special rule for Class<>, i.e allow Class of a raw type
>> without emitting any warning.
>>
>> Rémi
>>
>>
>
More information about the compiler-dev
mailing list