Как получать класс стоимости, сохраняемой как Object в Java?

Я пишу программу, в которой я оказываюсь обязанным, чтобы использовать такие вещи как эта:

HashMap<String,Object> valores = new HashMap<>();
valores.put("valor1", "abc");              // Se guarda como objeto String
valores.put("valor2", (int) 123);          // Se guarda como objeto Integer
valores.put("valor3", (double) 3.1416);    // Se guarda como objeto Double

Итак, в другой части кода я нуждаюсь в том, чтобы сохранять эту стоимость в базе данных. Я использую готовое решение, и мне хотелось бы делать что-то как это:

ps = conn.preparedStatement("insert into tbl (v1, v2, v3) values (?,?,?)")
for(int i = 1; i <= 3; i++) {
    if(/*valores.get(String.format("valor%d",i)) es String*/)
        ps.setString(i, (String) valores.get(String.format("valor%d",i)));
    else if(/*valores.get(String.format("valor%d",i)) es Integer*/)
        ps.setInt(i, (Integer) valores.get(String.format("valor%d",i)));
    else if(/*valores.get(String.format("valor%d",i)) es Double*/)
        ps.setDouble(i, (Double) valores.get(String.format("valor%d",i)));

}

Итак, мой специфический вопрос: Как я могу, во время выполнения, получать тип переменной, сохраняемой как Object?

4
задан 29.06.2016, 21:11
3 ответа

Твоего друга зовут instanceof, (доставший из aquГ - и aquГ - ).

Имея переменную типа Object ты можешь получать тип внутренней информации, складируемой в этой следующей формы: Последованные

Object O = "Hello world";
if (O instanceof String) System.out.println("Es un string");

:

Es un string.

то, что примененное у тебя cГіdigo настоящий осталось бы asГ-:

for(int i = 1; i <= 3; i++) 
{
    if(valores.get(String.format("valor%d",i)) instanceof String)
        ps.setString(i, (String) valores.get(String.format("valor%d",i)));
    else if(valores.get(String.format("valor%d",i)) instanceof Integer)
        ps.setInt(i, (Integer) valores.get(String.format("valor%d",i)));
    else if(valores.get(String.format("valor%d",i)) instanceof Double)
        ps.setDouble(i, (Double) valores.get(String.format("valor%d",i)));

}
6
ответ дан 24.11.2019, 13:58
  • 1
    Convendr и # 237; когда один и #250 добавляют; ltimo else throw new RuntimeException(...) или немного из-за стиля. Схвати и # 237; если кто-то добавляет данные о другом типе, ошибка прыгает. – leonbloy 30.06.2016, 00:41
  • 2
    Итак, если, но это уже decisi и # 243; n op. – NaCl 30.06.2016, 00:54

я оказываюсь обязанным использовать такие вещи как эта

Только я могу представлять себе то, что они указывают на тебя с пистолетом :-)

Правда в том, что он ужасный (включая это "valor1", "valor2"...)

Но, если ты действительно обязан это делать, тогда не необходимо, чтобы ты проверил реальный тип в runtime (ответ таким образом NaCL правилен), ты можешь использовать прямо setObject (), Java имеет mapeo default Ваших типов по отношению к типам SQL, который в твоем случае (и предполагая, что ты не использовал больше типы, чем эти) был бы должен достигать.

ps.setObject(i, valores.get(String.format("valor%d",i)));

PS: Шага, относительно instanceof: на самом деле instanceof он не служит для того, чтобы получить тип / класс объекта, а для того, чтобы проверить, что объект - некоего типа. И "быть некоего типа" означает, что реальный класс - этот или потомок. Например, в твоем случае instanceof Number он возвратит истинный, когда стоимостью будут Integer или Double, (они увеличивают оба Number, и следовательно "это Number", несмотря на то, что Ваш истинный класс будет другим). Если ты хочешь получить конкретный класс, ты должен использовать object.getClass().

3
ответ дан 24.11.2019, 13:58
  • 1
    jajaja..., так как это пистолета ты не создаешь себе, что est и # 225; такой отдаленный от реальности;) Относительно этого " valor1" " valor2"... одинокие примеры. Пытаться и # 233; с setObject() – Barranka 30.06.2016, 00:37

Не если он будет стоить тебе, но если из-за типа ты имеешь в виду класс переменной, ты можешь делать просто:

variable.getClass();

Это возвратит тебе objecto типа Class.

0
ответ дан 24.11.2019, 13:58