Не работает в общем случае. Даже если вы определите свой метод как:
@SafeVarargs
public void callMe(Object... args) { ... }
Когда вы звоните callMe(1, "hallo", 3.14159, new Object())
, это будет работать. Однако, если вы хотите иметь подобный метод в интерфейсе, вы не можете использовать @SafeVarargs
, так как он может быть добавлен только к конечным методам (чтобы они не были переопределены небезопасной реализацией).
Лучшее, что вы можете сделать в этом случае, это определить в вашем интерфейсе:
@SuppressWarnings("unchecked")
public <T> void callMe(T... args);
Это, по крайней мере, пропустит предупреждение, когда callMe вызывается с объектами того же типа времени выполнения, например, `callMe (" a "," b "," c "). Однако при вызове его с разными типами появится предупреждение, как в примере выше:
ArbitraryCallable x = new ArbitraryCallableImplementation();
x.callMe("a", "b"); // no warning
x.callMe(1, "x", 3.14159); // warning
И не стоит забывать, поскольку Object...
является не чем иным, как синтаксическим сахаром для Object[]
, вы не можете просто вызвать `callMe (new Object [] {" a "}), потому что это создает неоднозначную ситуацию: вы хотели вызвать callMe с одним объектом (который является массивом) или с элементами массива?