我有以下代码:
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 :(得分:5)
您可以使用instanceof
和/或getClass
。前者针对特定类进行测试,后者实际上为您提供了Class
对象(String.class
等)。例如:
if (a instanceof String) {
// ...
}
else if (a instanceof Integer) {
// ...
}
// ...
但是对于您的具体情况,您可以能够使用其中一个PreparedStatement#setObject
版本。
答案 1 :(得分: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();
}
答案 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()方法可以使您的工作更轻松。