方法原型中 varargs 的多个对象类型?

2022-09-03 06:17:47

我正在尝试编写一个Java函数的原型,该函数可以使用任意数量的整数和字符串进行调用:

myMethod(1, 2, 3, "Hello", "World"); // Valid call
myMethod(4, "foo", "bar", "foobar"); // Valid call

理想情况下,我希望int和字符串以任何顺序给出(并且可能混合):

myMethod(1, "Hello", 2, "World", 3); // Valid call

我想过使用varargs,但原型中只能有一个。我的另一个想法是使用以下原型:

public void myMethod(Object ... objs) { [...] }

...但是我觉得应该有一个编译错误,以防它被调用而不是预期的类型。当然,可以执行运行时检查(),但这不是一个非常优雅的解决方案,不是吗?instanceof

你会怎么做?


答案 1

如果你想让它是类型安全的,我会选择这个:

public myMethod(Thing<?>... thing) { ... }

然后创建你的 Thing 类:

public interface Thing<T> {
    public T value();
}

public class IntThing implements Thing<Integer> {
    private final int value;

    public IntThing(int value) {
        this.value = value;
    }

    public Integer value() {
        return value;
    }
}

我会把它留给你的想象力来弄清楚如何编写StringThing。显然,使用比“Thing”更好的名字,但我无法帮助你。

然后创建两个静态方法:

public static Thing<Integer> thing(int value) {
    return new IntThing(value);
}

public static Thing<String> thing(String value) {
    return new StringThing(value);
}

然后,将每个对象包装在对 以下各项的调用中:thing

myMethod(thing(1), thing(2), thing(3), thing("Hello"), thing("World"));

混乱?是的。不幸的是,Java没有能力像其他语言一样隐藏这些东西。Scala的隐式定义在这里会帮助你,但这会带来一大堆其他问题。就个人而言,我会进行检查,但这将确保您的代码在编译时是安全的。instanceof


答案 2

在 Java 编程语言中,没有办法让它工作,以便您可以传递任意数量的字符串和整数,并且当您传递字符串或整数以外的其他内容时,编译器会给出错误。