ho un'interfaccia generica HandlerCome implementare pattern factory con generici in Java?
public interface Handler<T> {
void handle(T obj);
}
posso avere n implementazioni di questa interfaccia. Diciamo che ho seguito 2 implementazioni per ora. Uno che si occupa di oggetti String e un altro maniglie Data Visto
public class StringHandler implements Handler<String> {
@Override
public void handle(String str) {
System.out.println(str);
}
}
public class DateHandler implements Handler<Date> {
@Override
public void handle(Date date) {
System.out.println(date);
}
}
Voglio scrivere una fabbrica che restituirà le istanze del gestore in base al tipo di classe. Qualcosa di simile a questo:
class HandlerFactory {
public <T> Handler<T> getHandler(Class<T> clazz) {
if (clazz == String.class) return new StringHandler();
if (clazz == Date.class) return new DateHandler();
}
}
vengo seguente errore in questa fabbrica:
Tipo non corrispondente: non può convertire da
StringHandler
aHandler<T>
Come risolvere questo problema?
Non so perché si vuole andare così in profondità nel generici. Perché non basta avere un metodo getStringHandler() e un metodo getDateHandler() ed essere fatto con esso? ..... è più chiaro all'utente in questo modo. –
Non puoi fare ciò che stai tentando nel tuo esempio. Il compilatore non può seguire la tua logica che se 'clazz' è' String.class' allora 'T' è' String'. È ovvio per te, ma non per il compilatore. – Kayaman
@OliverWatkins Vuoi dire che dovrei cambiare l'interfaccia di Handler per prendere Object invece di digitare T e lanciare Object sui rispettivi tipi nell'implementazione delle classi? Ma questo non violerebbe il Principio di sostituzione di Liskov? – user1522820