有没有办法制作一个可以在 Java 中使用 [] 的自定义类,类似于数组?

Posted

技术标签:

【中文标题】有没有办法制作一个可以在 Java 中使用 [] 的自定义类,类似于数组?【英文标题】:Is there a way to make a custom class that can have [] used on it in Java, similar to an array? 【发布时间】:2012-11-23 12:56:22 【问题描述】:

对于 Java,有没有办法创建一个自定义类,可以像数组一样在其上使用 [] 访问器?

普通数组

int[] foo = int[5];
foo[4] = 5;
print(foo[4]);
//Output: "5"

自定义类

class Bar 
    //Custom class that uses index as a ref


Bar foo = new Bar(5);
foo.set(4, 5);
print(foo[4]);
//Output: "5"

【问题讨论】:

我希望...如果可以覆盖[],我们就不会被丑陋的list.get(5)str.charAt(6) 所困?.. 不,我经常听到有关运算符重载将在 Java 的后续版本中出现的传言,但老实说,我认为不会。 作为旁注,看看 groovy :) @JonTaylor 老实说,我认为 Java 已经错过了运算符重载的总线。 我的印象一直是Java故意不希望运算符重载成为可能......我认为这是有道理的。 (我听说它可能被用于集合类型,但没有别的,我可以接受。) 【参考方案1】:

不,您不能为 Java 中的类重载 [] 运算符。但是你可以为你的数组创建 getter。

【讨论】:

【参考方案2】:

不,Java 没有任何运算符重载。

【讨论】:

【参考方案3】:

不,您必须实现 public <Type> get(int index) ... 方法,例如 ArrayList 所做的那样。

【讨论】:

【参考方案4】:

不,要做到这一点,Java 必须添加 [] 的运算符重载 - 您需要改用等效的 get / set 方法。

据我所知,目前没有为任何未来版本的 Java 实现运算符重载的计划——它绝对不在 Java 8 的计划中,而且 Oracle 就 Java 9 及更高版本进行的讨论不包括它的计划任何一个。就我个人而言,我不喜欢它 - 它引入了许多复杂性,例如优先级和顺序,除非用户非常小心,否则可能会导致微妙、烦人的错误,并且(无论你是否同意这种立场)我相信这是首先决定将其从语言中排除的原因。

【讨论】:

通用运算符重载确实存在一些问题,但其中大多数源于这样一个事实,即thing1 + thing2 是否应该在thing1 或thing2 中定义并不清楚。相比之下,thing1[thing2] 应该在 thing1 中定义就更清楚了。【参考方案5】:

当然,

试试

Bar[] foo = new Bar[4];
foo[2] = new Bar();
System.out.print(foo[2]);

问候

【讨论】:

说真的,怎么了?我无法想象任何情况下 [] 的重载应该比Collection 的继承更受青睐。对于其他所有情况:创建一个 Bar! 数组

以上是关于有没有办法制作一个可以在 Java 中使用 [] 的自定义类,类似于数组?的主要内容,如果未能解决你的问题,请参考以下文章

有没有办法制作一个自 JIT 编译的程序? [关闭]

有没有办法可以在 iPhone SDK 上制作叠加视图?

有没有办法制作穿孔文本?

有没有办法使用 kivy 在虚拟环境中制作 .exe?

有没有办法在没有 WPF 或 Visual Studio 的情况下在 C# 中制作 GUI(仅使用代码)?

有没有办法在 iOS 中使用 react-native 来制作像 Android StaggeredGridView 这样的布局