【问题标题】:In Java what do arrays inherit from? Can I do this?在 Java 中,数组继承自什么?我可以这样做吗?
【发布时间】:2010-12-24 12:02:16
【问题描述】:

抱歉这个新手问题,我习惯了 C#,所以我的 Java 框架知识不太好。

我有几个数组:

int[] numbers = new int[10];
String[] names = new String[10];

//populate the arrays

现在我想做一个通用函数来打印这些数组中的值,如下所示(这应该在 C# 中工作)

private void PrintAll(IEnumerable items)
{    
    foreach(object item in items)       
        Console.WriteLine(item.ToString());
} 

我现在要做的就是

PrintAll(names);
PrintAll(numbers);

如何在 Java 中做到这一点? Java中数组的继承树是什么?

非常感谢

骨头

【问题讨论】:

标签: c# java arrays


【解决方案1】:

回答关于什么类的问题 - 有a look at the docs。 java.lang.Object 就是答案。

关于迭代你应该知道的事情 - 看看 Java enhanced for each statementInterface Iterable Iterable<E> 正如其他人评论的那样,不幸的是 Array 没有实现 Iterable<E>

【讨论】:

  • 遗憾的是,数组没有实现Iterable
  • 不,他们没有,但增强了每个适用于数组和 Iterable 的功能。
【解决方案2】:

数组只在Java中实现SerializableCloneable1;所以没有通用的方法可以做到这一点。您必须为每种类型的数组实现一个单独的方法(因为像 int[] 这样的原始数组不能转换为 Object[])。

但在这种情况下,您不必这样做,因为 Arrays 可以为您完成:

System.out.println(Arrays.toString(names));
System.out.println(Arrays.toString(numbers));

这将产生类似:

[汤姆、迪克、哈利] [1、2、3、4]

如果这还不够好,您将不得不为每个可能的数组类型实现一个方法版本,就像 Arrays 所做的那样。

public static void printAll(Object[] items) {
    for (Object o : items)
        System.out.println(o);
}
public static void printAll(int[] items) {
    for (int i : items)
        System.out.println(i);
}
public static void printAll(double[] items) {
    for (double d : items)
        System.out.println(d);
}
// ...

请注意,以上仅适用于数组。 Collection 实现了Iterable,所以你可以使用:

public static <T> void printAll(Iterable<T> items) {
    for (T t : items)
        System.out.println(t);
}

1JLS §10.7 Array Members

【讨论】:

  • 思路一样,但是包含了数组字符串表示;例如“[1, 2]”。我不知道这样行不行。
  • 本地类型并不多,因此添加单独的方法应该不是那么大的负担。
  • 有 8 个基元加上 Object,因此如果您对每个基元执行多个方法,这可能会变得乏味。
【解决方案3】:

您可以尝试以下方法。

(它不适用于 int 类型,因为它是原始类型。您可以改用对象 Integer。)

public void print(Object[] objects){
    for (Object o: objects){
        System.out.println(o);      
    }
}

【讨论】:

    【解决方案4】:

    正如其他答案所述,int[]String[] 没有共同的超类可以让您这样做。您可以做的一件事是将数组包装在一个列表中,然后再将它们传递给您的PrintAll() 函数。这很容易使用Arrays.asList(myArray) 完成。然后你的 PrintAll() 函数可以接受 CollectionIterable 并以这种方式迭代。

    【讨论】:

    • 或者更好的是,Iterable
    【解决方案5】:

    这是一种查找哪个是数组的超类(这是一个普通对象)的方法

        String[] array = {"just", "a", "test"};
    
        Object obj = array;  // not really needed, just as example
        System.out.println("class: " + obj.getClass());
        System.out.println("super: " + obj.getClass().getSuperclass());
    

    不是解决方案,而是对问题的回答(至少是标题)。
    我会建议 Arrays.toString 就像 mmyers 已经完成的那样

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-07-30
      • 1970-01-01
      • 1970-01-01
      • 2020-10-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多