异构数组有什么意义?

Aar*_*ken 16 ruby python java arrays dynamic

我知道比Java和Ruby更动态的Java语言通常允许您将混合类型的对象放在数组中,如下所示:

["hello", 120, ["world"]]
Run Code Online (Sandbox Code Playgroud)

我不明白为什么你会使用这样的功能.如果我想在Java中存储异构数据,我通常会为它创建一个对象.

例如,说a Userhas int IDString name.虽然我在Python/Ruby/PHP中看到你可以这样做:

[["John Smith", 000], ["Smith John", 001], ...]
Run Code Online (Sandbox Code Playgroud)

这似乎有点不太安全/ OO不是创建一个类User具有属性IDname,然后让你的数组:

[<User: name="John Smith", id=000>, <User: name="Smith John", id=001>, ...]
Run Code Online (Sandbox Code Playgroud)

这些<User ...>东西代表用户对象.

是否有理由在支持它的语言中使用前者而不是后者?或者是否有更大的理由使用异构数组?

NB我不是在谈论包含所有实现相同接口或从同一父接口继承的不同对象的数组,例如:

class Square extends Shape
class Triangle extends Shape
[new Square(), new Triangle()]
Run Code Online (Sandbox Code Playgroud)

因为对于程序员来说,至少仍然是一个同质数组,因为你将对每个形状做同样的事情(例如,调用draw()方法),只有两者之间通常定义的方法.

小智 4

正如 katrielalex 所写: 没有理由不支持异构列表。事实上,禁止它需要静态类型,我们又回到了那个老争论。但我们不要这样做,而是回答“你为什么要使用那个”部分......

老实说,如果我们利用上一段中的异常并选择比 Java 或 C# 等更自由的“实现相同接口”定义,那么它的使用率并不高我的几乎所有可迭代处理代码都期望所有项目都实现某个接口。当然可以,否则它起不了多大作用!

不要误会我的意思,有绝对有效的用例 - 很少有充分的理由编写整个类来包含某些数据(即使您添加了一些可调用对象,函数式编程有时也能解决问题)。不过,字典是更常见的选择,而且命名元组也非常简洁。但它们并不像您想象的那么常见,并且它们是经过深思熟虑和纪律使用的,而不是用于牛仔编码。

(另外,你的“User作为嵌套列表”的例子不是一个好的例子 - 因为内部列表是固定大小的,你最好使用元组,这使得它即使在 Haskell 中也有效(类型是[(String, Integer)]))