【问题标题】:Get the type of array element in Java获取Java中数组元素的类型
【发布时间】:2013-10-28 13:40:04
【问题描述】:

我有以下方法:

public static int arraySum(Object obj) {
}

该方法应该返回 obj 中所有元素的总和;该方法的前提条件是obj是任意维度的Integer数组,即IntegerInteger[]Integer[][]等。

为了编写方法arraySum() 的主体,我使用了foreach 循环和递归;但是,对于 foreach 循环,我需要知道 obj 的元素是哪种类型。有没有办法找出obj的类型(即IntegerInteger[]等)?

编辑:这是我的 CS 课程的作业。我不想简单地问如何编写方法,这就是为什么我要问这样一个具体的问题。

【问题讨论】:

  • 您不只使用 2 个重载是否有特定原因?
  • if(myarray[I] instanceof type) ....;你觉得这就是你想要的吗?
  • @JeroenVannevel 不确定什么是过载:P
  • @pedromss obj 可以有任意数量的维度,这意味着很多很多的 if 语句
  • stackoverflow.com/questions/5670972/… 相关。你应该有充分的理由想要这样做。对我来说,这听起来像是一个 XY 问题。也许你应该给我们更多关于你为什么要这样做的背景信息。

标签: java arrays object integer


【解决方案1】:

我相信它比你想象的要简单:

public static int arraySum(Object obj) {
    if (obj.getClass() == Integer.class)
        return ((Integer) obj).intValue();

    int sum = 0;
    for (Object o : (Object[]) obj)
        sum += arraySum(o);

    return sum;
}

基本上,我们利用了这样一个事实,即任意维度的 Integer 数组仍然是 Object[]


Object obj = new Integer[][][]{{{1,2,3}},{{4,5,6},{7,8,9}},{{10}}};

System.out.println(arraySum(obj));
55

【讨论】:

  • 如果你这样称呼它arraySum(new Object()),这将导致ClassCastException。在 for 循环中进行强制转换之前,应该对数组类型 obj.getClass().isArray() 进行额外检查,当然还有 null 检查。
  • @A4L “此方法的前提条件是obj 是一个任意维度的整数数组” 虽然如果他真的需要,OP 可以添加这些检查。这是一个微不足道的添加,方法的核心将保持不变。
  • OP 必须确保只传递数组给它。 +1 仍然是一个优雅的解决方案!
【解决方案2】:

你可以用简单的instanceof来做,例如:

if (obj instanceof Integer[][]) 
    System.out.println("2d");
if (obj instanceof Integer[]) 
    System.out.println("1d");
if (obj instanceof Integer) 
    System.out.println("0d");

【讨论】:

    猜你喜欢
    • 2011-10-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-04
    • 1970-01-01
    • 2018-07-20
    相关资源
    最近更新 更多