Olá pessoal!
Gostaria de saber como que eu posso fazer uma classe usando Singleton e Generics.
Fiz assim e não funcionou direito:
public class Classe<E extends Storable> {
private static Classe<? extends Storable> classe;
public static <E extends Storeable> Classe<? extends Storeable> openConnection(Class<? extends Storeable> clazz)
throws ConnectionException {
if (classe == null) {
classe = new Classe<E>(clazz);
}
return classe;
}
}
Queria saber se é possível trabalhar com genéricos em métodos estáticos e a melhor forma.
Obrigada!
Olá elisangela tente isso veja:
public class Classe<E extends Storable> {
private static Classe<? extends Storable> classe;
public static <E extends Storeable> Classe<? extends Storeable> openConnection(Class<? extends Storeable> classe) throws ConnectionException {
if (classe == null) {
classe = new Classe<E>(clazz);
}
return classe;
}
}
Fallow
[quote=paulo1911]Olá elisangela tente isso veja:
public class Classe<E extends Storable> {
private static Classe<? extends Storable> classe;
public static <E extends Storeable> Classe<? extends Storeable> openConnection(Class<? extends Storeable> classe) throws ConnectionException {
if (classe == null) {
classe = new Classe<E>(clazz);
}
return classe;
}
}
Fallow[/quote]
Desculpe, mas não entendi tua alteração. Você renomeou o parâmetro clazz para classe. A única coisa que isso faz é pular o teste e retornar o próprio parâmetro passado.
Com um detalhe importante, você está passando como parâmetro um objeto do tipo Class e está retornando um objeto do tipo Classe que creio dar erro de cast.
Fiz um teste rápido aqui, adaptando o código faltante 
O que notei: Em alguns pontos você estava usando Storeable e em outros, Storable.
[code]public class Classe<E extends Storeable> {
private static Classe<? extends Storeable> classe;
private Class<? extends Storeable> clazz;
public Classe(Class<? extends Storeable> clazz) {
this.clazz = clazz;
}
@Override
public String toString() {
Storeable instance = null;
try {
instance = this.clazz.newInstance();
} catch (Exception e) {
e.printStackTrace();
}
return instance.toString();
}
public static <E extends Storeable> Classe<? extends Storeable> openConnection(Class<? extends Storeable> clazz)
throws ConnectionException {
if (classe == null) {
classe = new Classe<E>(clazz);
}
return classe;
}
public static void main(String[] args) {
System.out.println("TESTE");
try {
Classe<? extends Storeable> result = openConnection(Teste.class);
System.out.println(result);
} catch (ConnectionException e) {
e.printStackTrace();
}
}
}
class Storeable {}
class ConnectionException extends Exception {}
class Teste extends Storeable {
@Override
public String toString() {
return "Hello world";
}
}[/code]