通用 OR 代替 AND <T 扩展了数字 |字符序列>

2022-09-01 11:03:21

是否可以一般地参数化接受 ClassA 或 InterfaceB 的方法?

由于|而无法编译伪代码

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

即,我希望这一种方法接受数字或字符序列作为参数,而不是编写多个方法签名。

应使用数字或字符序列参数传递

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

答案 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));