Path: csiph.com!x330-a1.tempe.blueboxinc.net!newsfeed.hal-mli.net!feeder1.hal-mli.net!weretis.net!feeder4.news.weretis.net!news.musoftware.de!wum.musoftware.de!news.mind.de!news.cs.uni-magdeburg.de!fu-berlin.de!uni-berlin.de!individual.net!not-for-mail From: Robert Klemme Newsgroups: comp.lang.java.programmer Subject: Re: Problem with generics and dynamic array copy Date: Fri, 22 Jul 2011 21:27:06 +0200 Lines: 50 Message-ID: <98u18jF6l7U1@mid.individual.net> References: Mime-Version: 1.0 Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit X-Trace: individual.net 24xgGmFCBntwyTzs69r09g+zjoBcFREY8OPE8NwaYkk2Kp3S0= Cancel-Lock: sha1:W16G8MXg/SFCzAJbbe+Nw9/kzQY= User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.2.18) Gecko/20110616 Lightning/1.0b2 Thunderbird/3.1.11 In-Reply-To: Xref: x330-a1.tempe.blueboxinc.net comp.lang.java.programmer:6411 On 22.07.2011 20:36, Sebastian wrote: > Am 22.07.2011 20:23, schrieb markspace: >> On 7/22/2011 10:30 AM, Sebastian wrote: >> >>>> public static final T[] arraycopy( T[] src ) >>>> { >>>> Class componentType = src.getClass().getComponentType(); // !!!! >> >> >> RTFM. getComponentType() returns Class, not Class. >> >> >> >> >> >> public Class getComponentType() >> >> Returns the Class representing the component type of an array. If this >> class does not represent an array class this method returns null. >> > > well, yes, but given that src.getClass() must give one the class object > for arrays with component type T, why is the compiler not smart enough > to infer that the unknown class parameter in the return value of > getComponentType() must be T? As a human I can see that, that's why I > can cast to Class, but I don't believe that I'm smarter than javac... The compiler has no idea what the semantics of getComponentType() is. It could be implemented as public Class getComponentType() { return Object.class; } and still be conformant to the declaration. Hence it cannot do any automatic inference based on the fact you know that the array is T[]. Btw, you can actually pass B[] where B is a subclass of T. Since Array.newInstance() accepts Class you should simply use that - that cast to T[] is needed anyway. Of course, even better you scrap your implementation and use http://download.oracle.com/javase/6/docs/api/java/util/Arrays.html#copyOf%28T[],%20int%29 Cheers robert -- remember.guy do |as, often| as.you_can - without end http://blog.rubybestpractices.com/