Path: csiph.com!x330-a1.tempe.blueboxinc.net!usenet.pasdenom.info!aioe.org!eternal-september.org!feeder.eternal-september.org!.POSTED!not-for-mail From: Susan Calvin Newsgroups: comp.lang.java.programmer Subject: Re: Java generics and type erasure Date: Wed, 25 May 2011 00:13:08 +0000 (UTC) Organization: A noiseless patient Spider Lines: 30 Message-ID: References: <9d4c2b16-beb5-40b1-87a2-f03e971efeed@k17g2000vbn.googlegroups.com> Mime-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Injection-Date: Wed, 25 May 2011 00:13:08 +0000 (UTC) Injection-Info: mx04.eternal-september.org; posting-host="cNpCepq5ls7RITQAmvxvhg"; logging-data="10092"; mail-complaints-to="abuse@eternal-september.org"; posting-account="U2FsdGVkX1+qgBcpd+GaYSJ6DSTAAihxXd54904RmaE=" User-Agent: slrn/3.1 (USERIX 1.7) Cancel-Lock: sha1:rhXdlq0bwwczpvjavumm7GweH2A= Xref: x330-a1.tempe.blueboxinc.net comp.lang.java.programmer:4554 On Tue, 24 May 2011 23:05:25 +0000, Ian Shef wrote: > "The type of a constructor (§8.8), instance method (§8.8, §9.4), or non- > static field (§8.3) M of a raw type C that is not inherited from its > superclasses or superinterfaces is the erasure of its type in the > generic declaration corresponding to C." This seems silly to me. I mean, if you have a class that starts: public class Foo { public Map m1; public Map m2; then the logical way to deal with a raw Foo is to treat it as if T were ? (or ? extends whatever its lower type bound was, or etc.), so in Foo aFoo = new Foo(); aFoo.m1 would have compile-time type Map (since no matter what T was, it would be a Map) and aFoo.m2 would have compile-time type Map -- disallowing puts and having gets have type ?, assignable only to Object, but still recognizing the key type as String. The only reason I can think of for not doing this (the logic seems simple enough to implement) is that it turned out doing so would break legacy code that used util collections' raw types. Was that why? Perhaps there should be a compile flag that turns on the legacy-compatible behavior for use when compiling 1.4 and older sources, but which is off by default? Though I guess it's too late for that now. :P