2011-01-03 8 views
2

У меня есть следующий код:java: Как узнать тип переменной внутри объекта?

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, зависит от того, какой тип переменной передается функции.

любые идеи?

благодаря

+0

Метод getClass() –

ответ

5

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

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

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

+0

благодарит! :) Я не заметил, что могу просто использовать setObject на подготовленном языке. – ufk

+0

+1 для setObject. он реализован с instanceof в любом случае. – Bozho

+0

@ufk: не стоит беспокоиться, просто убедитесь, что он делает то, что вы ожидаете, с различными типами, которые вы подаете, ваш JDBC-коннектор и базовая база данных. Документы предполагают, что может быть странный дракон, скрывающийся, хотя я, кажется, вспоминаю, что использовал его (некоторое время назад) для хорошего эффекта. –

4
  • 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

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

if(something instanceof String) 
{ 
} 
else if(something instanceof YourType) 
{ 
} 
+0

не в Java. :) – Bozho

+1

@ Божо почему нет? Это работает отлично, и вы пишите так себе –

+1

@Sean Patrick Floyd, изначально изначально использовался 'something is String'. не 'instanceof' – Bozho

1

если (а InstanceOf Integer) или , если (а InstanceOf String)

0

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

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

Что вы делаете с InstanceOf или GetClass(), как правило, плохая практика. Вы теряете важную информацию о типе, используя Object, а затем поворачиваетесь и жестко кодируете информацию типа в лестнице if. Лучше определить несколько методов для каждого типа, все называемые одинаковыми.Так что если у вас есть SomeFunction, который может принимать 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-complier для обработки работы, чтобы вы соответствовали правильному методу с типом, который передал ему вызывающий. Нет необходимости в лестнице if, и компилятор будет жаловаться пользователю, если он не использует известный тип, который выступает против использования объекта, и он умирает во время выполнения.

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

Смежные вопросы