java - framework - tutorial django
OR genérico en lugar de AND<T extiende número | CharSequence> (2)
¿Es posible parametrizar genéricamente un método que acepte CUALQUIER clase A o interfaz B?
No se compila debido a | Pseudocódigo
public <T extends Number | CharSequence> void orDoer(T someData){ // ... }
es decir, en lugar de escribir varias firmas de métodos, me gustaría que este método aceptara un número o una secuencia de caracteres como argumento
Debe pasar con un argumento Number OR CharSequence
orDoer(new Integer(6));
int somePrimitive = 4;
orDoer(somePrimitive);
orDoer("a string of chars");
¿Usar una clase abstracta anónima es una opción para ti? Cuando necesito tipos de parámetros seguros o tipos de devolución, uso alguna variante del código a continuación. Una vez dicho esto, estoy de acuerdo con los otros comentarios aquí, y tengo curiosidad por saber qué beneficio obtendrá realmente cuando implemente un tipo de seguridad para un grupo de objetos que no tienen tanto en común.
public abstract class Doer<T> {
public void do(T obj) {
// do some stuff.
}
}
// calling method
new Doer<Number>(){}.do(new Integer(5));
Si realmente quieres hacerlo, deberás envolver tus clases aceptadas dentro de una clase personalizada propia. En su caso de ejemplo, probablemente algo así como:
public class OrDoerElement {
private final Number numberValue;
private final CharSequence charSequenceValue;
private OrDoerElement(Number number, CharSequence charSequence) {
this.numberValue = number;
this.charSequenceValue = charSequence;
}
public static OrDoerElement fromCharSequence(CharSequence value) {
return new OrDoerElement(null, value);
}
public static OrDoerElement fromNumber(Number value) {
return new OrDoerElement(value, null);
}
}
Y su método orDoer
se convierte en:
public void orDoer(OrDoerElement someData) { .... }
Luego puedes construir uno de esos y usar en tu método usando:
orDoer(OrDoerElement.fromCharSequence("a string of chars"));
orDoer(OrDoerElement.fromNumber(new Integer(6)));
Pero, sinceramente, eso suena demasiado complejo y demasiado trabajo solo para poder llamar a un método con diferentes tipos de parámetros. ¿Estás seguro de que no puedes lograr lo mismo usando dos métodos y un tercer método para la lógica común?