【问题标题】:Extract array encapsulated in an Object提取封装在对象中的数组
【发布时间】:2012-10-06 09:49:03
【问题描述】:

假设我有一个封装在一个对象中的数组:

String[] strvls = { "Alessio", "Ale" };
Object container = strvls;

我想从容器对象中提取数组,我该怎么做?

我知道这是一个以这种方式检查的数组:

if(container.getClass().isArray()) {
    //Extract the encapsulated array - How ?
}

我不能转换成 String 数组,因为我不能确定数组的类型是 String[] ... 所以我需要转换成泛型类型数组,在 Java 中是否可能?

【问题讨论】:

  • 没有为数组定义泛型类型。你应该选择ArrayList..
  • 我需要一种方法来发现封装数组的大小...

标签: java arrays object


【解决方案1】:

您可以将其转换为Object[] 数组:

String[] strvls = { "Alessio", "Ale" };
Object container = strvls;
if (container.getClass().isArray()) {
    Object[] data = (Object[]) container;
    System.out.println(data.length);
}

【讨论】:

  • 不,它会打印出2container 只是一个引用,它被转换回 Object[]。测试一下!
  • 转换为泛型类型会更好,但是如果在 Java 中不可能,您的解决方案可以完成这项工作。谢谢。
  • 准确的说它不能是泛型,因为数组在Java中不是泛型的。
  • 你不能构造一个泛型类型数组,但是你可以把一个Object[]转换成一个T[],然后它就变成了一个泛型数组。
  • 泛型是一个不同的话题,我想强调这一点。
【解决方案2】:

类似于 Karaszi 的回答,但可能是捷径:

if(container instanceof Object[])
  System.out.println("Array size: " + ((Object[])container).length);

重要提示:这不适用于原始数组。上面的代码有效,因为 String 派生自 Object 类。

【讨论】:

    【解决方案3】:

    你可以有这样的方法:

    private static <T> T[] getArray(Object o){
        return (T[]) o;
    }
    

    这将有助于使用泛型类型,并且您可以将任何“未经检查”的编译器警告封装在此方法中。然后你可以这样做:

    Object[] array = getArray(container);
    

    如果你对类型一无所知,或者:

    String[] array = getArray(container);
    

    如果你知道它是一个字符串数组。

    【讨论】:

      猜你喜欢
      • 2014-06-03
      • 1970-01-01
      • 2011-03-24
      • 2018-09-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-03
      • 1970-01-01
      相关资源
      最近更新 更多