<?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>Zona J &#187; overriding</title>
	<atom:link href="http://zonaj.org/tag/overriding/feed/" rel="self" type="application/rss+xml" />
	<link>http://zonaj.org</link>
	<description>Zona Java - Um blog português sobre java.</description>
	<lastBuildDate>Sun, 29 Jun 2014 18:29:19 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>https://wordpress.org/?v=4.1.41</generator>
	<item>
		<title>Variância em Java</title>
		<link>http://zonaj.org/2009/03/12/variancia-em-java/</link>
		<comments>http://zonaj.org/2009/03/12/variancia-em-java/#comments</comments>
		<pubDate>Thu, 12 Mar 2009 07:00:08 +0000</pubDate>
		<dc:creator><![CDATA[Ruben Badaró]]></dc:creator>
				<category><![CDATA[java]]></category>
		<category><![CDATA[imasters]]></category>
		<category><![CDATA[overriding]]></category>
		<category><![CDATA[tipos]]></category>
		<category><![CDATA[variancia]]></category>

		<guid isPermaLink="false">http://www.zonaj.org/?p=204</guid>
		<description><![CDATA[Variância em sistemas de tipos de linguagens orientas a objectos é uma noção simples e com a qual nos deparamos todos os dias mas é complexa de explicar. Eu tenho normalmente dificuldade em explicar o que é a outras pessoas por isso decidi escrever este post e assim mando-lhes apenas o link Variância neste contexto &#8230; <a href="http://zonaj.org/2009/03/12/variancia-em-java/" class="more-link">Continue reading <span class="screen-reader-text">Variância em Java</span></a>]]></description>
				<content:encoded><![CDATA[<p>
Variância em sistemas de tipos de linguagens orientas a objectos é uma noção simples e com a qual nos deparamos todos os dias mas é complexa de explicar. Eu tenho normalmente dificuldade em explicar o que é a outras pessoas por isso decidi escrever este post e assim mando-lhes apenas o link <img src="http://zonaj.org/wp-includes/images/smilies/icon_smile.gif" alt=":)" class="wp-smiley" /></p>
<p>Variância neste contexto está directamente relacionada com herança. É relevante para compreender como é feito matching de parametros de métodos, resultados de retorno, tipos genéricos e outros casos.</p>
<p>Existem três tipos de variância: invariância, covariância e contravariância.</p>
<ul>
<li><strong>Covariância</strong></li>
<p>Suponhamos o seguinte caso:</p>
<pre class="prettyprint">public class X {
    Object getValue() { return null; }
}

public class Y extends X {
    String getValue() { return null; }
}</pre>
<p>A covariância neste caso está no tipo de retorno. Significa que se a classe Y é mais específica que X (Y&lt; X) então qualquer método de Y que faça override a um método de X tem de retornar um tipo <strong>igual ou mais específico</strong>. Neste caso, o tipo de retorno do método que faz override é String, que é mais específico que Object.<br />
Diz-se, pois, que os tipos de retornos em Java são covariantes (<a href="http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4144488">desde a versão 1.5</a>).</p>
<li><strong>Contravariância</strong></li>
<p>Contravariância é efectivamente o inverso de covariância. Significa que se a classe Y é mais específica que X (Y&lt;X) então qualquer método de Y que faça override a um método de X tem de retornar um tipo <strong>igual ou mais genérico</strong>.</p>
<p>Em Java não há contravariância e overriding de métodos é sempre invariante &#8230; que passo a explicar de seguida. É no entanto possível ter contravariância usando wildcards de generics.</p>
<li><strong>Invariância</strong></li>
<p>Em Java overriding de métodos é invariante, ou seja, para se redefinir um método numa subclasse, os parâmetros têm de ser exactamente do mesmo tipo do seu ancestror.</p>
<p>Este comportamento é muitas vezes descurado, veja-se o seguinte exemplo:</p>
<pre class="prettyprint">public class A {
    boolean equals(A object) {
        //Fantastico, sempre igual
        return true;
    }
}</pre>
<p>Como o overriding é invariante, não estamos na realidade a fazer override do método boolean equals(Object o) mas sim overload, adicionando um novo método com outra assinatura. O pior é que passa completamente despercebido.</p>
<p>A solução desde Java 5 é adicionar a anotação @Override que vai permitir que o compilador detecte estes casos e informe que não estamos realmente a redifinir um método. Aliás, todos os IDEs decentes sugerem que se adicione esta anotação.</ul>
<p style="font-weight:bold;font-size:large">Uma nota sobre Generics</p>
<p>As noções de covariância e contravariância são importantes de ter presente quando definindo classes tipificadas com generics, especialmente quando se usam as wildcards para explicitamente definir relações entre tipos. Não estamos a definir realmente relações hierárquicas entre tipos, pois não há a relação de herança entre classes genéricas mas estamos a definir relações entre os tipos que parametrizam essa classe, se me consigo fazer entender.</p>
<p>Por exemplo:</p>
<pre class="prettyprint">public class Teste {
    void pseudoCovariante(List&lt;? extends A&gt; param) {}

    void pseudoContravariante(List&lt;? super A&gt; param) {}
}</pre>
<p>Aqui definimos dois métodos para dar exemplos de como dotar classes tipificadas de noções de contravariância e covariância, já que se não usarmos wildcards temos parametros invariantes.</p>
<p>Espero ter conseguido explicar os conceitos básicos. Estas noções aparecem em diversos textos sobre linguagens de programação e é essencial compreender estas noções para se entender bem o sistema de tipos da linguagem Java.</p>
]]></content:encoded>
			<wfw:commentRss>http://zonaj.org/2009/03/12/variancia-em-java/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>
