Resolver sobrecarda de método através de generics

Galera, estou com um dúvida em relação a como efetuar sobrecarga de métodos.
Criei uma classe no seguinte esquema:

public class ws1 {
	public static void main(String[] args) {
		int i[] = {1,4,5,6};
		ws1 d= new ws1();
		d.serializeObjetc(i);
	}
	public<T> void serializeObject(T[] array){
		System.out.println("passou em array");
	}
	public void serializeObjetc(Object ob) {
		System.out.println("Passou em Objetc");
	}
}

O que estou querendo é que caso o tipo passado for um array de qualquer tipo de objeto ele utilize o método parametrizado e caso contrário utilize utilize o método que recebe um Objetc. Da maneira que fiz, toda vez ele entra no segundo método. Tentei sem sucesso altera-lo para a seguinte assinatura:

public<T> void serializeObjetc(T ob) {
		System.out.println("Passou em Objetc");
}

Alguém pode me tirar essa dúvida sobre como declarar esses métodos

flw[:D]

Seu problema não é de generics e sim de ortografia. Mais cuidado ao soletrar, hein?

serializeObject != serializeObjetc

Como você está chamando serializeObjetc, ele está chamando serializeObjetc e não serializeObject.

Certo! fui a algumas aulas de inglês e consertei meu erro. Mas o problema continua, ele não está conseguindo invocar o método correto

class TesteSobrecarga {
    public <T> void serializeObject (T[] array) {
        System.out.println ("serializeObject<T> foi chamado");
    }
    public void serializeObject (Object obj) {
        System.out.println ("serializeObject(Object) foi chamado");
    }
    public static void main(String[] args) {
        TesteSobrecarga ts = new TesteSobrecarga();
        int[] x = new int[10];
        Integer[] y = new Integer[10];
        String z = null;
        ts.serializeObject (x); // imprime "serializeObject(Object) foi chamado"
        ts.serializeObject (y); // imprime "serializeObject<T> foi chamado"
        ts.serializeObject (z); // imprime "serializeObject(Object) foi chamado"
    }
}

Tem mais uma coisinha - T não pode ser um tipo primitivo (como “int”), apenas algo que deriva de Object (como “java.lang.Integer”)
Por isso, quando você usou “int[]”, foi chamada a versão que serializa um objeto, não um array.

Que saudade de C++ :P!! HUm… realmente!! mas o problema é que tenho de alguma forma tratar tipos primitivos tb! vc sugere alguma coisa pra ser trabalhada, seja com ou sem generics

No caso específico de tipos primitivos, você tem de usar o método nojento de ficar fazendo um monte de instanceof. Sorry…

public void serializeObject (Object obj) {
    if (obj instanceof int[]) {
        serializeArrayInt ((int[])obj);
    } else if ...
    ...
}

:S então pelo visto terei de implementar pra todos os primitivos :@

mas vlw pela ajuda

Saudade do C++? Pera aí, mermão, você já usou templates em C++? Ainda prefiro os generics (apesar de suas limitações), porque se você faz qualquer besteira com templates em C++ você tem de adivinhar - as mensagens de erro da maior parte dos compiladores são horríveis.
(Concordo que quando dá problemas com generics as mensagens de erro são mais medonhas ainda, mas é difícil fazê-las ocorrer.)

Tenho saudade dos templates de C++ pq ele não diferencia entre tipos primitivos e complexos para usar como tipo parametrizado…:stuck_out_tongue:

Você poderia fazer assim…com varArgs

[code]
public class wsl {
public static void main(String[] args) {
int a[] = {1,3,5};
Integer b[] = {2,4,6};
wsl d= new wsl();
d.serializeObject(a);
d.serializeObject(b);
}

    public void serializeObject(Object... ob) {   
        for(int i = 0;i<ob.length;i++){
        	System.out.println(ob[i]);
        }
    }
    
}

[/code]>

[quote=txithihausen]Tenho saudade dos templates de C++ pq ele não diferencia entre tipos primitivos e complexos para usar como tipo parametrizado…:stuck_out_tongue:

[/quote]

a) O pessoal do .NET ouviu as suas preces e permite o uso de tipos primitivos em Generics no C# 3.0, VB.NET etc. (não sei se o J# também tem generics). Use o MS Visual Studio 2005 ou 2008.
b) O sr. Neal Gafter, após sair da Sun (ele era o gerente da equipe que implementou o javac do Java 5.0) resolveu que seria interessante ter Generics com tipos primitivos no Java. Só que isso seria bastante complexo para implementar.

Mesmo assim não irá resolver da forma que eu quero. O problema é que o objeto que estou chamando no momento pode estar sendo representado como um Object e desse modo ele chama o método que possui Object como parâmetro

eu estava interessado em fazer algo do tipo:

public Element serializeObject(Integer ob) {
}

public Element serializeObject(String ob) {
}

public Element serializeObject(Integer[] ob) {
}

/* .... */
public Element serializeObject(Object ob) {
	return null;
}

Eu a principio pensei que seria possível fazer algo do tipo

Integer i=5;
Object a = i;
serializeObject(a);

que a JVM seria capaz de definir qual tipo de objeto está de fato sob o ‘Object’ e chamar o método apropriado ou se for apenas um Object chamar o método ‘padrão’. Não funcionou:(
To vendo se há alguma forma de dar um cast no objeto antes de invocar a função, pois desse maneira funciona tranquilamente. Alguem sabe se existe alguma maneira de dar um cast no objeto a partir do Class desse objeto, ja que por polimorfismo ele está retornando o tipo correto para os metadados desse objeto.

Não sei mais se generics seria apropriado a esse caso, ja que são implementações diferentes para cada tipo primitivo. Mantendo parametrizado apenas o tratamento de arrays, que seria executado um ‘for’ do método ‘serializeObject’ em cada elemento, ou seja, seria da mesma maneira para todo tipo de objeto

[quote=thingol][quote=txithihausen]Tenho saudade dos templates de C++ pq ele não diferencia entre tipos primitivos e complexos para usar como tipo parametrizado…:stuck_out_tongue:

[/quote]

a) O pessoal do .NET ouviu as suas preces e permite o uso de tipos primitivos em Generics no C# 3.0, VB.NET etc. (não sei se o J# também tem generics). Use o MS Visual Studio 2005 ou 2008.
b) O sr. Neal Gafter, após sair da Sun (ele era o gerente da equipe que implementou o javac do Java 5.0) resolveu que seria interessante ter Generics com tipos primitivos no Java. Só que isso seria bastante complexo para implementar. [/quote]

Quanto ao suporte a Generics na plataforma .NET não sabia que já estava com um desenvolvimento tão aprimorado. Confesso que meu conhecimento na plataforma .NET(C#, J#, VB), ainda é muito limitado. Me meto apenas por pura necessidade, minha principal lih ainda é C e C++ e um pouco agora Java e python :smiley:

Cara você esta complicando coisas simples…

Se vc cria uma varíavel do tipo Object … Você não pode querer que o java saiba sozinho que Object é Integer. Isso por que um Integer é um object mas um Object não é um Integer…

Um Object é um object e ponto fuinal ela é a super classe de todas…

Eu acho que para o seu propósito o uso de Object não serve…tente usar os tipos mais específicos do tipo Wrapper já que eles aceitam tanto objetos como valores primitivos…