java:我怎么知道Object里面的变量类型?

时间:2011-01-03 13:17:15

标签: java variables

我有以下代码:

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 个答案:

答案 0 :(得分:5)

您可以使用instanceof和/或getClass。前者针对特定类进行测试,后者实际上为您提供了Class对象(String.class等)。例如:

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

但是对于您的具体情况,您可以能够使用其中一个PreparedStatement#setObject版本。

答案 1 :(得分:4)

  • object.getClass()返回对象的类。您可以使用equalsisAssignableFrom(..)进行反思性比较。
  • 您可以使用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();
}

答案 2 :(得分:1)

使用instanceof关键字

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

答案 3 :(得分:1)

if(一个整数的实例)或 if(一个stringof String)

答案 4 :(得分:0)

如果你最终目标是使用数据库操作,最好不要在你的函数上使用Object。它没有告诉任何人通过什么是合法的。我建议改用JDBC setObject(int parameterIndex,Object x,int targetSqlType),让调用者为你识别JDBC Type:

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

使用instanceof或getClass()进行的操作通常是一种不好的做法。您通过使用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()方法可以使您的工作更轻松。