Java: Как я могу узнать тип переменной внутри объекта? - PullRequest
2 голосов
/ 03 января 2011

У меня есть следующий код:

void testme(Object a) {
  # printing the type of the variable transferred to the function  
}

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

Integer a=5;
testme(a);

или

String a="a";
testme(a);

В общем, я создаю универсальные функции для работы с моей базой данных, и мне нужно использовать setLong / setInt / setString в зависимости от того, какой тип переменной передан функции.

есть идеи?

спасибо

Ответы [ 5 ]

5 голосов
/ 03 января 2011

Вы можете использовать instanceof и / или getClass. Первый тестирует определенный класс, последний фактически дает вам объект Class (String.class и т. Д.) Для аргумента. Так, например:

if (a instanceof String) {
    // ...
}
else if (a instanceof Integer) {
    // ...
}
// ...

Но для вашего конкретного случая вы можете иметь возможность использовать одну из версий PreparedStatement#setObject.

4 голосов
/ 03 января 2011
  • object.getClass() возвращает класс объекта. Вы можете использовать equals или isAssignableFrom(..) для рефлексивного сравнения.
  • вы можете использовать оператор instanceof для статического сравнения: if (object instanceof String) {..}

Хотя они хороши в вашем случае, вы должны избегать их использования в общем случае. Если вы заранее знаете, какие типы будут переданы, перегрузите методы: foo(Integer i) и foo(String s). Если вы не знаете, вы можете использовать полиморфизм и двойную диспетчеризацию. Просто заставьте ваши объекты реализовывать общий интерфейс:

interface Testable {
   void invokeTest();
}

class FooTest implements Testable {
    public void invokeTest() { // code specific for FooTest }
}

class BarTest implements Testable {
    public void invokeTest() { // code specific for BarTest }
}

А потом:

public void test(Testable testable) {
    test.invokeTest();
}
1 голос
/ 03 января 2011

if (экземпляр типа Integer) или if (экземпляр String)

1 голос
/ 03 января 2011

Используйте ключевое слово instanceof

if(something instanceof String)
{
}
else if(something instanceof YourType)
{
}
0 голосов
/ 03 января 2011

Если ваша конечная цель - работать с базой данных, лучше НЕ использовать Object в вашей функции, как эта.Это никому не говорит, что законно проходить.Я бы предложил вместо этого использовать JDBC setObject (int parameterIndex, Object x, int targetSqlType), чтобы вызывающий абонент идентифицировал вам тип JDBC:

 public void someFunction( Object obj, int targetSqlType ) {
    statement.setObject( nextIndex, obj, targetSqlType );
 }

как правило, плохая практика.Вы теряете важную информацию о типе, используя Object, затем поворачиваясь и жестко кодируя эту информацию о типе в лестнице if.Лучше определить несколько методов для каждого типа с одинаковыми именами.Поэтому, если у вас есть функция, которая может принимать 5 различных типов параметров, вы должны сделать следующее:

  public void someFunction( Integer value ) {
       statement.setInt( convertThisValue( value ) );
  }

  public void someFunction( Long value ) {
       statement.setLong( convertThisValue( value ) );
  }

  public void someFunction( String value ) {
     ...
  }

  public void someFunction( Boolean value ) {
     ...
  }

  public void someFunction( Double value ) {
     ...
  }

  private <T extends Number> T convertThisValue( T value ) {
     // do some shared logic on processing the value
  }

В этом примере я показал, как вы можете легко определить все типы, которые вы понимаете, как отдельные методы, отличающиеся толькопо типу и как вы могли бы централизовать некоторую логику преобразования в универсальной функции (convertThisValue ()), чтобы вы могли разделить некоторую обработку между несколькими типами.Что лучше в этом подходе, так это то, что вы используете компилятор Java для обработки работы, сопоставляя правильный метод с типом, который ему передал вызывающий.Нет необходимости в лестнице if, и компилятор будет жаловаться пользователю, когда он не использует известный тип, в отличие от использования Object и его смерти во время выполнения.

В JDBC известные типы хорошо определенытак что вы можете легко создавать методы, которые знают, как обрабатывать каждый тип, понятный каждой базе данных JDBC.Также использование метода setObject () значительно облегчает вашу работу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...