TreeSet

Ola galera alguem sabe pq nao posso inserir mais de um Objeto[] Integer
dentro de um TreeSet?

 TreeSet<Object> tr=new TreeSet<Object>();

    Integer vt[]={};
    Integer vt2[]={2};
    tr.add(vt);
    tr.add(vt2);

ao inserir o primeiro ok,mas no segundo lanca um Classcast Exception!

Integer[] não implementa Comparable (embora Integer implemente).

Se você inserir o segundo objeto, então add tentará chamar compareTo sobre o argumento (vt2), mas como Integer[] não implementa Comparable, então vai dar esse ClassCastException.

[quote=thingol]Integer[] não implementa Comparable (embora Integer implemente).

Se você inserir o segundo objeto, então add tentará chamar compareTo sobre o argumento (vt2), mas como Integer[] não implementa Comparable, então vai dar esse ClassCastException.
[/quote]
è verdade mesmo pois tinha uma questo assim na prova !Agora entendi pq errei!! valeu cara obrigado!! :smiley:

O TreeSet ele aceita do mesmo tipo mesmo que vc nao use generic. Veja

import java.util.TreeSet;
public class TreSet {

	public static void main(String[] args) {
		TreeSet  ts = new TreeSet();
			ts.add(8);
			ts.add("camilo");
	}
/* lança uma excecao devido ter tipo diferentes
 * tanto TreeSet quando TreeMap nao permite tipos diferente
 * ClassCastException acontece
 */
}

flw!

[quote=LPJava]O TreeSet ele aceita do mesmo tipo mesmo que vc nao use generic. Veja

import java.util.TreeSet;
public class TreSet {

	public static void main(String[] args) {
		TreeSet  ts = new TreeSet();
			ts.add(8);
			ts.add("camilo");
	}
/* lança uma excecao devido ter tipo diferentes
 * tanto TreeSet quando TreeMap nao permite tipos diferente
 * ClassCastException acontece
 */
}

flw![/quote]

LpJava a exceção ClassCastException lança quando vc tenta converter um pai em um filho ou quando vc tenta classificar um um conjunto ou array de tipos diferentes. No caso de TreeSet ele classifica automaticamente.

Não é que TreeSet e TreeMap não aceitem tipos diferentes. É que ele sempre tenta chamar compareTo, e pode ser que não esteja definido ou compareTo lance uma exceção quando você jogue coisas de tipos diferentes (não-comparáveis).

Aqui dou um exemplo de um TreeSet que aceita objetos de classes derivadas de uma determinada classe:

import java.util.*;

abstract class Numero implements Comparable&lt;Numero&gt; {
	abstract public double valor();
	public int compareTo (Numero outro) {
	    double valorOutro = outro.valor();
		if (valor() &lt; valorOutro) return -1;
		else if (valor() &gt; valorOutro) return +1;
		else return 0;
	}
}
class Longo extends Numero {
    long l;
    public Longo (long l) {
		this.l = l;
	}
	public double valor () { return l; }
	public String toString() { return Long.toString(l); }
}

class Flutuante extends Numero {
    double d;
    public Flutuante (double d) {
	    this.d = d;
	}
	public double valor() { return d; }
	public String toString() { return Double.toString (d); }
}

class TesteTreeSetClassesDiferentes {
    public static void main(String[] args) {
	    Set&lt;Numero&gt; numeros = new TreeSet&lt;Numero&gt;();
		numeros.add (new Longo (3));
		numeros.add (new Flutuante (2.34));
		System.out.println (numeros); // imprime [2.34, 3]
	}
}

[quote=anderson.bonavides][quote=LPJava]O TreeSet ele aceita do mesmo tipo mesmo que vc nao use generic. Veja

import java.util.TreeSet;
public class TreSet {

	public static void main(String[] args) {
		TreeSet  ts = new TreeSet();
			ts.add(8);
			ts.add("camilo");
	}
/* lança uma excecao devido ter tipo diferentes
 * tanto TreeSet quando TreeMap nao permite tipos diferente
 * ClassCastException acontece
 */
}

flw![/quote]

LpJava a exceção ClassCastException lança quando vc tenta converter um pai em um filho ou quando vc tenta classificar um um conjunto ou array de tipos diferentes. No caso de TreeSet ele classifica automaticamente.[/quote]

Exato e pq vc acha que o TreeSet faz isso quando vc coloca tipo diferente? olhe a resposta do thingol explica o por que… do ClassCastException é lançado…

[quote=thingol]Não é que TreeSet e TreeMap não aceitem tipos diferentes. É que ele sempre tenta chamar compareTo, e pode ser que não esteja definido ou compareTo lance uma exceção quando você jogue coisas de tipos diferentes (não-comparáveis).

Aqui dou um exemplo de um TreeSet que aceita objetos de classes derivadas de uma determinada classe:

[code]
import java.util.*;

abstract class Numero implements Comparable<Numero> {
abstract public double valor();
public int compareTo (Numero outro) {
double valorOutro = outro.valor();
if (valor() < valorOutro) return -1;
else if (valor() > valorOutro) return +1;
else return 0;
}
}
class Longo extends Numero {
long l;
public Longo (long l) {
this.l = l;
}
public double valor () { return l; }
public String toString() { return Long.toString(l); }
}

class Flutuante extends Numero {
double d;
public Flutuante (double d) {
this.d = d;
}
public double valor() { return d; }
public String toString() { return Double.toString (d); }
}

class TesteTreeSetClassesDiferentes {
public static void main(String[] args) {
Set<Numero> numeros = new TreeSet<Numero>();
numeros.add (new Longo (3));
numeros.add (new Flutuante (2.34));
System.out.println (numeros); // imprime [2.34, 3]
}
}
[/code][/quote]

Cara esse teu exemplo é muito show de bola!!Parabéns!