Estou trabalhando em uma classe genérica em Java que armazena um objeto do tipo T, e preciso verificar o tipo do objeto para manipular valores nulos de forma diferente para Integer e String. No entanto, quando tento verificar o tipo de classe com isAssignableFrom
, a condição não parece disparar como esperado. Especificamente, estou tentando retornar valores padrão (0 para Integer e "padrão" para String) quando o valor armazenado é nulo. Mas, por algum motivo, minha verificação para Integer.class.isAssignableFrom(getGenericClass())
não funciona, e sempre falha em retornar nulo.
Aqui está o código relevante:
// General class for storage
public class Storage<T> {
private final T item; // Stored object
// Constructor for storage
public Storage(T item) {
this.item = item;
}
// Method to get the object from storage
public T get() {
if (item == null) {
// Logic for null values
if (Integer.class.isAssignableFrom(getGenericClass())) {
return (T) Integer.valueOf(0); // Default for integers
} else if (String.class.isAssignableFrom(getGenericClass())) {
return (T) "default"; // Default for strings
}
// Return null if the type is not recognized
return null;
}
return item; // Return the item if it's not null
}
// Helper method to determine the class type
private Class<?> getGenericClass() {
return item != null ? item.getClass() : Object.class;
}
}
Neste exemplo, se eu passar null
para o armazenamento, espero que o código retorne uma saída diferente com base no tipo, mas Integer.class.isAssignableFrom(getGenericClass())
não dispara quando o tipo é Inteiro e sempre retorna nulo.
Saída esperada:
Se o tipo for Integer , quero retornar 0
quando o valor for null
. Se o tipo for String , quero retornar "default"
quando o valor for null
.
Saída real:
A saída é nula em ambos os casos, mesmo que o valor seja null
.
Como posso comparar corretamente o tipo de classe com Integer ou String? isAssignableFrom
Não é a abordagem correta neste caso e, se não for, qual é a maneira correta de comparar o tipo de classe neste cenário?
Também tentei
if (item == null) {
if (Integer.class.equals(getGenericClass())) {
return (T) Integer.valueOf(0); // Alternative for numbers
} else if (String.class.equals(getGenericClass())) {
return (T) "default"; // Alternative for strings
}
return null; // Return null for unknown types
}