Generic OR en lugar de AND <T extends Number | CharSequence>

¿Es posible parametrizar genéricamente un método que acepta O bien ClassA O InterfaceB?

No compilar 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 aceptar un número o CharSequence como un argumento

Debe pasar con un argumento Number o CharSequence

 orDoer(new Integer(6)); int somePrimitive = 4; orDoer(somePrimitive); orDoer("a string of chars"); 

Si realmente quieres hacer eso, necesitarás envolver tus clases aceptadas en una clase personalizada. En su caso de ejemplo, probablemente algo 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) { .... } 

A continuación, puede crear uno de ellos y utilizarlo en su método mediante:

 orDoer(OrDoerElement.fromCharSequence("a string of chars")); orDoer(OrDoerElement.fromNumber(new Integer(6))); 

Pero honestamente, eso suena un poco demasiado complejo y demasiado trabajo sólo 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?

¿Está usando una clase abstracta anónima una opción para usted? Cuando necesito tipos de parámetros seguros o tipos de devolución, utilizo alguna variante del código de abajo. Dicho esto, estoy de acuerdo con los otros comentarios aquí, y estoy curioso qué beneficio realmente se derivan cuando se está aplicando un tipo de seguridad para un grupo de objetos que no tienen todo eso 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)); 
FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.