Если вы хотите, чтобы это было безопасно для типов, я бы сказал:
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.Очевидно, что используйте лучшее имя, чем «Вещи», но я не могу вам с этим помочь.
Затем вы делаете два статических метода:
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
, но эта проверка обеспечит безопасность вашего кода во время компиляции.