Получить тип класса vargs, если в Java для varg установлено значение null - PullRequest
0 голосов
/ 02 октября 2009

Как вы можете получить тип данных аргумента переменной в Java, если для varg задано значение null? Я использую getClass для получения типа. Есть ли другой способ?

public void method(String name, Object ... vargs)
{
    for(Object arg : vargs)
    {
        mapType.put(arg.getClass());
        mapVal.put(arg);
    }
}

Единственное, о чем я мог подумать, это использовать аннотацию из вызывающей функции. Есть ли другой способ?

Ответы [ 4 ]

2 голосов
/ 02 октября 2009

Давайте разделим вопрос между vararg и нулем.

vararg

Смысл varargs в том, чтобы отправлять массив данных, не имея их в коде вызывающего, в виде массива , но в виде отдельных переменных или констант.

Вызов varargs может быть не очень интуитивным, вот что происходит в различных случаях:

    method("", "1", "2"); // vargs is {"1", "2"}
    method(""); // vargs is {}, the empty array (it is not null)
    method("", null); // vargs is {null}, size 1 array containing the element 'null'
    method("", (Object[])null); // vargs is null, a null instance

Обратите внимание, что третий случай считается дурным тоном. Например, вы получаете предупреждение, если ноль является константой (не хранится в переменной).

Обратите внимание, что в четвертом случае вы действительно ищете проблемы! ; -)

Класс Null

Теперь мы говорим о массиве, который содержит нулевое значение, а не о нулевом массиве (который был отсортирован в предыдущей части).

Общий случай

Нуль может быть любого класса (все одновременно). Но instanceof всегда будет возвращать false.

Положить в карту

Если одно значение равно нулю, вам нужно подумать о том, что вы хотите сделать. Очевидно, getClass () не может быть вызван для нулевого значения. Таким образом, вы можете выбрать между:

  1. пропустить нулевое значение , не добавлять его на карту
  2. выберите класс , который вы хотите связать с нулем. Это может быть Object, или Void, или другой определенный класс. Подумайте, что вы хотите с ним сделать, потому что ассоциация произвольна ...
2 голосов
/ 02 октября 2009

Вы можете использовать

if (arg == null)

чтобы обработать его как особый случай и назначить ему класс, где Object или Void кажутся подходящими.

2 голосов
/ 02 октября 2009

Мы столкнулись с той же проблемой для загрузки данных из БД и приведения, как и ожидалось. К сожалению, нуль не имеет типа. Вместо этого мы использовали универсальную оболочку, которая всегда была ненулевой, но могла содержать нулевое значение. В этом случае информация о типе доступна над полем оболочки.

2 голосов
/ 02 октября 2009

Я не уверен, что понимаю, что вы пытаетесь сделать. Нуль не имеет класса. Если вам нужен статический класс переменной, используемой вызывающей функцией, вы можете передать этот класс в качестве аргумента.

...