Genericos

6 respostas
anderson.bonavides

Qual dos fragmentos inseridos na linha comentada compila?

public class Test2 { public <T extends Comparable> T findLarger(T x, T y){ if(x.compareTo(y)> 0){ return x; }else { return y; } } public static void main(String[] args) { Test2 t = new Test2(); //INSIRA O CÓDIGO AQUI. } }

A) Object x = t.findLarger(123,456);

B) int x = t.findLarger(123, new Double(456));

C) int x = t.findLarger(123, new Integer(123));

D) int x = (int) t.findLarger(123, new Integer(123), new Double(456));

Galera alguêm poderia me ajudar com essa?

Tentei mas não consegui entender.
:cry:

6 Respostas

T

Essa questão é meio chata - na minha prova não caiu tal grau de compreensão de generics. Acho que não cai nada tão difícil assim.

import java.util.*;

class Test2 {
	public &lt;T extends Comparable&gt; T findLarger(T x, T y){
		if(x.compareTo(y)&gt; 0){
			return x;			
		}else {
			return y;
		}
	}
	public static void main(String[] args) {
		Test2 t = new Test2();
        // A linha 1 (OK) equivale a: Object x = (Object) t.findLarger ((Object) new Integer(123), (Object) "456");
		Object x = t.findLarger(123,"456"); // OK
        // A linha 2 a seguir é equivalente a 
        // Integer x = t.findLarger (new Integer(123), new Double(456)) e é por isso
        // que dá problemas (T x = Integer != T x = Double)
        int x = t.findLarger(123, new Double(456)); 
        // A linha 3 (OK) a seguir equivale a:
        // int x = ((Integer) t.findLarger (new Integer (123), new Integer (123)).intValue();
        int x = t.findLarger(123, new Integer(123)); 
        // A linha 4 vai dar problema porque não há findLarger com 3 parâmetros. 
        int x = (int) t.findLarger(123, new Integer(123), new Double(456)); 
	}
}
anderson.bonavides

Não posso dizer que to um expert. Mas posso dizer que compreendi.
:expressionless:

Raff

como o thingol falow eu acho que A,B,C é isso mesmo pessoal ?

Giulliano

Pelo pouco que eu entendi do código apenas A e B são corretas…

Raff

eu tbm entendi muito pouco !!!hauha valew cara!!

victorwss

A não compila porque o erasure comum entre Integer (via autoboxing) e String é Object, e Object não implementa Comparable.

B não compila porque, embora Number implemente Comparable (Number é superclasse de Integer e Double), o tipo de retorno seria Number, que não pode ser atribuído a int sem um autounboxing e um cast.

C compila, pois com o autoboxing o tipo T se refere a Integer que com autounboxing é atribuído a int.

D não compila porque findLarger tem dois parâmetros, e não três.

Essa é a minha aposta.

Criado 17 de janeiro de 2008
Ultima resposta 18 de jan. de 2008
Respostas 6
Participantes 5