3

在 Java 中,我想将数组转换为列表。鉴于 Java 是一种 OOP 语言,我希望这样做:

int[] myArray = { 1, 2, 3 };               // non-working code
List myList = myArray.toList();

但是当我发现array对象没有 toList 方法并且做我想要的正确方法是:

int[] myArray = { 1, 2, 3 };               // working Java code
List myList = Arrays.asList(myArray);

起初我想知道 anint[]是否不被视为对象,但我能够调用诸如clone()on 之类的方法,所以我确定它是一个对象。

为什么 Java 的设计者使用第二种方法(与 OOP 不一致的静态方法)而不是第一种方法(在与 OOP 原则一致的对象上进行操作)?

我注意到 C++ 也做了类似于第二种方法的东西,我认为这是 C 留下的包袱。但在 C# 中,有一种ToList()方法。

只是Arrays.asList()对面向 OOP 的进化进程的坚持,还是有一些潜在的理论可以这样做?

4

4 回答 4

3

int[] 是一个对象。

然而,OOP 并不要求对象提供所有接受它作为参数的工厂方法。

于 2013-06-12T14:56:37.107 回答
3

数组没有您可能期望它们拥有的各种方法,并且它拥有的方法是从 Object 继承的,并且通常是无用的。

int[] array = { 1, 2, 3 };
int[] array2 = { 1, 2, 3 };
System.out.println(array.equals(array2)); // prints false
System.out.println(array.hashCode() == array2.hashCode()); // prints false
System.out.println(array.toString()); // prints something like [I@a2634feg

我试图让 Sun/Oracle 解决这个问题,但我得到的谣言是正确修复它会非常复杂。

于 2013-06-12T14:57:20.727 回答
1

转换方法不是您期望的。而且没有真正的技术原因。如果您查看 Scala(它使用相同的 VM,并且字节码是兼容的):

object ArrayListDemo {
  def main(args: Array[String]) {
    val list = args.toList
    val array = list.toArray

    println("= List =")
    println(list)
    println(list.mkString(", "))
    println(list.size)
    println(list.length)

    println("= Array =")
    println(array)
    println(array.mkString(", "))
    println(array.size)
    println(array.length)
  }
}

这会给你这个结果(如果用两个参数Hello和调用world):

= 列表 =
列表(你好,世界)
你好,世界
2
2
= 数组 =
[Ljava.lang.String;@15663a2
你好,世界
2
2

您可以看到它实际上是一个“JVM 数组”,带有附加方法。并且所有集合类型(丰富的和原始的)都有转换方法。

所以,是的,它感觉不像 OOP——它感觉“势在必行”。

于 2013-06-12T15:37:58.353 回答
1

数组 ( int[], Foo[]) 从第一个版本 (JDK1.0) 开始就存在于 Java 中。对数据结构的支持很少——你必须自己做。List并在 V1.2 ( http://docs.oracle.com/javase/6/ocs/api/java/util/List.html )ArrayList中引入。发生这种情况时,可能无法更改语言,或者当时语言过于复杂。Arrays

我是 Java 早期的密切观察者(通过与 Sun 的联系)。我记得 Java 1.0 相当基础,而图形(AWT 1.02)是在最后一刻编写的。在我的记忆中,Java 被设计为 OO,但最初的范围有限(它被宣传为一种新的动画语言,但 Java AWT 1.02 非常有限)。那个时期的文物仍然存在于规范中。

当时 Java 的巨大贡献是 WriteOnceRunAnywhere (WORA)(最初是 WriteOnceDebugEverywhere!),我怀疑这是早期开发人员和维护人员的首要考虑因素。Java 是由 C++ 提供的,并带有一些构造(例如 int,双作为原语 - 自动装箱后来作为一个杂物出现)。C# 能够从 Java(而不是 C++)开始,并且在某些方面是对 Java 应有的方式的修订。所有语言都从一些包袱开始,每一种新语言都会摆脱一些包袱。

于 2013-06-12T15:00:46.340 回答