<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Alex Chiri&#039;s Blog &#187; arrays</title>
	<atom:link href="http://www.alexchiri.ro/index.php/tag/arrays/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.alexchiri.ro</link>
	<description>A new life</description>
	<lastBuildDate>Mon, 28 Nov 2011 09:00:01 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=</generator>
<atom:link rel="hub" href="http://pubsubhubbub.appspot.com" />
	<atom:link rel="hub" href="http://superfeedr.com/hubbub" />
			<item>
		<title>Ciudățenii cu colecții și generice</title>
		<link>http://www.alexchiri.ro/index.php/2010/09/04/ciuda%c8%9benii-cu-colec%c8%9bii-%c8%99i-generice/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=ciuda%25c8%259benii-cu-colec%25c8%259bii-%25c8%2599i-generice</link>
		<comments>http://www.alexchiri.ro/index.php/2010/09/04/ciuda%c8%9benii-cu-colec%c8%9bii-%c8%99i-generice/#comments</comments>
		<pubDate>Sat, 04 Sep 2010 12:38:04 +0000</pubDate>
		<dc:creator>Alex Chiri</dc:creator>
				<category><![CDATA[D&#39;ale SCJP-ului]]></category>
		<category><![CDATA[arrays]]></category>
		<category><![CDATA[collections]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[scjp]]></category>

		<guid isPermaLink="false">http://alexchiri.ro/?p=647</guid>
		<description><![CDATA[Sunt multe "lucrușoare" din Java pe care chiar și cei care programează zilnic în Java nu le (mai) știu și mai ales pentru că nu le folosesc. Pentru asta există cărțile de Java, să ne mai aducă aminte de multe astfel de secrete. Recunosc, spre rușinea mea, că nu am folosit până în prezent prea [...]]]></description>
			<content:encoded><![CDATA[            <script type="text/javascript" src="http://www.alexchiri.ro/wp-content/plugins/wordpress-code-snippet/scripts/shBrushJava.js"></script>
<p>Sunt multe "lucrușoare" din Java pe care chiar și cei care programează zilnic în Java nu le (mai) știu și mai ales pentru că nu le folosesc. Pentru asta există cărțile de Java, să ne mai aducă aminte de multe astfel de secrete. Recunosc, spre rușinea mea, că nu am folosit până în prezent prea mult (în mod voit) avantajele polimorfismului, cel puțin în cazul apelurilor de metode.</p>
<p>Și astfel ajungem la subiect. Eu nu știam sau nu mi-am pus niciodată problema că ceea ce pot face astfel cu vectori: <pre class="brush: java">public class PoliArrayExample {
    public static void main(String[] args) {
        Integer[] ints = new Integer[3];
        Arrays arrs = new Arrays();
        arrs.doSomethingWithArrays(ints);
    }
}

class Arrays {
    public void doSomethingWithArrays(Object[] arr) {
        arr[0] = new String(&quot;test&quot;);
    }
}</pre></p>
<p>cu colecții nu este posibil, mai exact acest lucru nu se poate face:<pre class="brush: java">public class PoliArrayExample {
    public static void main(String[] args) {
        ArrayList&lt;Integer&gt; ints = new ArrayList&lt;Integer&gt;();
        Arrays arrs = new Arrays();
        arrs.doSomethingWithArrays(ints);
    }
}

class Arrays {
    public void doSomethingWithArrays(ArrayList&lt;Object&gt; arr) {
        arr.add(&quot;&quot;);
    }
}</pre></p>
<p>Se pare că în cazul colecțiilor în momentul în care semnătura metodei <code>public</code> <code>void</code> <code>doSomethingWithArrays(ArrayList&lt;Object&gt; arr)</code> va arăta astfel, nu vom putea apela decât cu un ArrayList de tip Object, fără subclase sau superclase (nu că Object ar avea super clase, dar putem extrapola). Prin urmare, în codul anterior vom avea probleme la linia 5. Acest lucru poate fi oarecum păcălit: <pre class="brush: java">public class PoliArrayExample {
    public static void main(String[] args) {
        ArrayList&lt;Integer&gt; ints = new ArrayList&lt;Integer&gt;();
        Arrays arrs = new Arrays();
        arrs.doSomethingWithArrays(ints);
    }
}

class Arrays {
    public void doSomethingWithArrays(ArrayList&lt;? extends Object&gt; arr) {
        arr.add(&quot;&quot;);
    }
}</pre></p>
<p>spunându-i compilatorului să accepte și clase care au extins sau implementat clasa/interfața de după <strong>extends, <span style="color: #ff0000;">cu condiția să nu adăugam nimic în colecția primită ca și parametru</span></strong>. Astfel, nu scăpăm, primind o eroare de compilare la linia 11, spunându-ne că nu există metoda <strong>add </strong>cu parametru de tip String. Putem folosi șmecheria de mai sus, atât timp cât nu adăugăm în acea colecție nimic. Și așa cum cu <strong>extends </strong>am permis accesul subclaselor, cu <strong>super </strong>putem permite accesul superclaselor:<pre class="brush: java">public class PoliArrayExample {
    public static void main(String[] args) {
        ArrayList&lt;Object&gt; ints = new ArrayList&lt;Object&gt;();
        Arrays arrs = new Arrays();
        arrs.doSomethingWithArrays(ints);        
    }
}

class Arrays {
    public void doSomethingWithArrays(ArrayList&lt;? super Integer&gt; arr) {
        arr.add(new Integer(1));
    }
}</pre></p>
<p>Și în acest caz nu vom avea nicio problemă să și adăugăm elemente în colecție, atât timp cât sunt de tipul specificat sau <strong><span style="color: #ff0000;">subclase</span></strong> ale tipului specificat. <em>(mulțumesc Ducu pentru corectură!)</em></p>
<p>Toate acestea se întâmplă datorită modului în care au fost implementate genericele în Java. Cei care au făcut genericele în Java au dorit ca odată cu apariția genericelor să poată fi folosit și codul de dinainte de Java 5 și generice. Prin urmare, genericele sunt doar la nivel de compilator și la runtime un obiect de tip <strong>List&lt;String&gt;</strong> devine un simplu obiect <strong>List</strong> și Java nu mai are niciun control asupra ceea ce pui în lista respectivă. La vectori treaba stă altfel și un String[] chiar și la runtime tot String[] rămâne și când vom încerca să adăugăm altceva decât tipul permis vom primi o excepție (<a href="http://download-llnw.oracle.com/javase/6/docs/api/java/lang/ArrayStoreException.html" target="_blank" class="broken_link">ArrayStoreException</a>).</p>
]]></content:encoded>
			<wfw:commentRss>http://www.alexchiri.ro/index.php/2010/09/04/ciuda%c8%9benii-cu-colec%c8%9bii-%c8%99i-generice/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Declararea și inițializarea de Array</title>
		<link>http://www.alexchiri.ro/index.php/2009/08/21/declararea-%c8%99i-ini%c8%9bializarea-de-array/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=declararea-%25c8%2599i-ini%25c8%259bializarea-de-array</link>
		<comments>http://www.alexchiri.ro/index.php/2009/08/21/declararea-%c8%99i-ini%c8%9bializarea-de-array/#comments</comments>
		<pubDate>Fri, 21 Aug 2009 08:23:20 +0000</pubDate>
		<dc:creator>Alex Chiri</dc:creator>
				<category><![CDATA[D&#39;ale SCJP-ului]]></category>
		<category><![CDATA[arrays]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[scjp]]></category>

		<guid isPermaLink="false">http://alexchiri.wordpress.com/2009/08/21/declararea-%c8%99i-ini%c8%9bializarea-de-array/</guid>
		<description><![CDATA[După cum bine se știe un Array, în Java, se poate declara în felul următor: int[] numere[] = new int[10][10]; Parantezele pătrate se pot pune ori la tipul de date, ori la numele variabilei, ori la amândouă. De asemenea dimensiunea poate lipsi la ultimele dimensiuni ale array-ului. Deci aș fi putut scrie și așa: int[] [...]]]></description>
			<content:encoded><![CDATA[            <script type="text/javascript" src="http://www.alexchiri.ro/wp-content/plugins/wordpress-code-snippet/scripts/shBrushJava.js"></script>
<p>După cum bine se știe un Array, în Java, se poate declara în felul următor:</p>
<p><em>int[] numere[] = new int[10][10];</em></p>
<p>Parantezele pătrate se pot pune ori la tipul de date, ori la numele variabilei, ori la amândouă. De asemenea dimensiunea poate lipsi la ultimele dimensiuni ale array-ului. Deci aș fi putut scrie și așa:</p>
<p><em>int[] numere[] = new int[10][];</em></p>
<p>Există două modalități de a face declararea și inițializarea unui Array:</p>
<ol>
<li><em>int[] numere = new int[] {1, 2, 3, 4};       <br /></em>Atenție: cand se face inițializarea array-ului nu se mai trece dimensiunea!</li>
<li><em>int[] numere = {1, 2, 3, 4};       <br /></em>Acesta este un bloc de inițializare, care poate fi folosit în locul liniei de mai sus, are același efect.</li>
</ol>
<p>Diferența între cele două modalități este că cea de-a doua nu este o expresie și nu poate fi folosită în felul următor:</p>
<p><em>int[] numere;</em></p>
<p><em>numere = {1, 2, 3, 4}; //nu e ok</em></p>
<p><em>numere = new int[] {1, 2, 3, 4}; //e ok</em></p>
]]></content:encoded>
			<wfw:commentRss>http://www.alexchiri.ro/index.php/2009/08/21/declararea-%c8%99i-ini%c8%9bializarea-de-array/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

