2

我有一个数组列表和一个将对象添加到数组列表的方法。目前我使用重载方法来区分不同类型的对象。有没有办法使用未定义的对象作为方法的参数并在方法内部区分它是什么类型的对象?

4

3 回答 3

2

一种方法是传递两个参数。第一个参数是您需要传递的对象,第二个参数是您传递的对象类型的指示符。

public void TestFunc(Object obj1, String type){}

当然,还有比使用 String 更好的方法,我们可以使用 Enums 和其他一些机制。如果您不想传递其他参数,也可以使用 InstanceOf 来区分。

于 2013-10-25T14:39:18.357 回答
2

通过“未定义的对象作为参数”,我假设您的意思是您要编写一个未在函数声明中指定对象类型的函数,从而允许您只有一个函数。

这可以通过泛型来完成。

代替:

static void func(String str)
{
  System.out.println("The string is: "+str);
}
static void func(Integer integer)
{
  System.out.println("The integer is: "+integer);
}

你可以有:

static <T> void func(T value)
{
  if (value instanceof Integer)
    System.out.println("The integer is: "+value);
  else if (value instanceof String)
    System.out.println("The string is: "+value);
  else
     System.out.println("Type not supported!! - "+value.getClass());
}

测试:

func("abc"); // The string is: abc
func(3);     // The integer is: 3
func(3.0);   // Type not supported!! - class java.lang.Double

有关更多信息,请参阅Java 泛型

于 2013-10-25T14:44:23.137 回答
1

通过“未定义的对象”,我假设您的意思是null. 您可以强制null转换为特定类型的对象,编译器将知道将哪个重载方法绑定到调用:

public void method(String s) { . . . }
public void method(Integer s) { . . . }
public void caller() {
    method((String) null);
    method((Integer) null);
}

如果你有一个未定义类型的对象,你可以使用instanceof运算符来测试它是什么类型,或者getClass()获取类对象本身。如果您有一个null未知类型的值,除了重新定义您的方法签名以接受额外的 type 参数之外,您无能为力Class

但是,如果 Dukeling 的评论是准确的并且“未定义的对象”是指“未知类型的对象”,则应该考虑使用 Java 泛型。泛型允许您编写一个适用于一系列对象类型的方法。

public <T> void method(T arg) { . . . }
public void caller() {
    method("String"); // String arg
    method(0);        // Integer arg
}

Java 泛型教程开始了解更多信息。

于 2013-10-25T14:38:13.097 回答