Подтвердить что ты не робот

Generic OR вместо AND <T extends Number | CharSequence>

Можно ли в общем случае параметризовать метод, принимающий EATER ClassA OR InterfaceB?

Не компилируется из-за | Псевдокод

public <T extends Number | CharSequence> void orDoer(T someData){ // ... }

то есть. вместо того, чтобы писать несколько сигнатур методов, я хотел бы, чтобы этот один метод принимал либо Number, либо CharSequence в качестве аргумента

Должен пройти с аргументом Number или CharSequence

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

Ответ 1

Если вы действительно хотите сделать это, вам нужно будет обернуть принятые вами классы в собственный собственный пользовательский класс. В вашем примере, возможно, что-то вроде:

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);
    }
}

И ваш метод orDoer будет выглядеть следующим образом:

public void orDoer(OrDoerElement someData) { .... }

Затем вы можете создать один из них и использовать в своем методе, используя:

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

Но, честно говоря, это звучит слишком сложно и слишком много работает, чтобы вызывать метод с разными типами параметров. Вы уверены, что не можете достичь того же, используя два метода, и третий метод для общей логики?

Ответ 2

Использует анонимный абстрактный класс для вас? Когда мне нужны типы безопасных параметров или типы возвращаемых данных, я использую некоторый вариант кода ниже. При этом я согласен с другими комментариями здесь, и мне любопытно, какую выгоду вы действительно получаете, когда вы применяете безопасность типов для группы объектов, у которых не так много общего.

public abstract class Doer<T> {

  public void do(T obj) {
    // do some stuff. 
  }

}

// calling method

new Doer<Number>(){}.do(new Integer(5));