【问题标题】:Casting ArrayList<String> to String[]将 ArrayList<String> 转换为 String[]
【发布时间】:2011-08-20 19:14:44
【问题描述】:

1) 我想知道为什么我不能这样做:

ArrayList<String> entries = new ArrayList<String>();
entries.add("entry");
String[] myentries = (String[])entries.toArray();

这有什么问题? (您可能会忽略第二行代码,它与问题无关)

2) 我知道我的目标可以使用此代码实现:

ArrayList<String> entries = new ArrayList<String>();
entries.add("entry");
String[] myentries = new String[entries.size()];
myentries = entries.toArray(myentries)

这是将 ArrayList 转换为字符串数组的首选方式吗?有没有更好/更短的方法?

非常感谢:-)

【问题讨论】:

    标签: java arrays list casting arraylist


    【解决方案1】:

    由 ArrayList 创建的后备数组不是 String 数组,它是 Object 数组,这就是你不能强制转换它的原因。

    关于情况 2。这是将其转换为数组的常用方法,但您可以通过编写使其不那么冗长:

    String[] myentries = entries.toArray(new String[entries.size()]);
    

    【讨论】:

      【解决方案2】:
      List<String> list = ...;
      String[] array = list.toArray(new String[list.size()]);
      

      【讨论】:

        【解决方案3】:

        第一个示例返回 Object[],因为列表不知道您想要什么类型的数组,并且无法将其转换为 String[]

        你可以让第二个稍微短一点

        String[] myentries = entries.toArray(new String[entries.size()]);
        

        【讨论】:

        • 谢谢大家的回复,他们都很有帮助。我发现这个答案的措辞比其他答案更清楚一些。对存档的一点提醒:您可以从子类转换为超类,但不能反过来。由于 Object 是 String 的超类,您可以从 String 转换为 Object,但不能反过来。这是非常基本的东西,如果你不使用它,你会忘记它;-)
        【解决方案4】:

        条目类型丢失(因为泛型在 Java 中被删除)。因此,当您执行 toArray 调用时,它只能返回 Object 类型,因为它知道 List 必须包含 Objects。所以你可以取回一个带有你的字符串的 Object[] 。如果你想要一个字符串数组,那么你需要将它传递给 toArray 方法。通过强制转换,您无法缩小 Array 引用,即您无法将对象数组转换为字符串数组。但你可以采取相反的方式,因为它们是协变的。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2012-08-31
          • 2014-01-09
          • 2014-05-16
          • 1970-01-01
          • 1970-01-01
          • 2017-11-09
          • 1970-01-01
          相关资源
          最近更新 更多