【问题标题】:Call Overloaded Function in Java?在Java中调用重载函数?
【发布时间】:2013-02-08 19:43:45
【问题描述】:

如何在Java中调用数组函数?

目前看起来是这样的:

public static void WriteLine(Object Array[]) {
    for (int I = 0; I < Array.length; ++I) {
        Out.println(Array[I]);
    }
}

public static void WriteLine(Object Text) {
    Out.println(Text);
}

我也试过了:

public static <T> void WriteLine(T Array[]) {
    for (int I = 0; I < Array.length; ++I) {
        Out.println(Array[I]);
    }
}

我主要是这样做的:

int[] I = new int[]{1, 2, 3, 4, 5};
WriteLine(I);

我也试过了:

WriteLine<int[]>(I);

没用..

它打印: [我@2f56f920

又名 int 数组的地址。如何显式调用特定的数组函数,或者如何让编译器知道自动(隐式)调用哪个?

我还不习惯 Java/Generics/Object.. 刚从 C++ 迁移到模板 :(

【问题讨论】:

  • 不,我希望它打印任何类型的数组。
  • 糟糕的风格。我作为循环的索引是怎么回事?你直到最近才写 FORTRAN 吗?学习 Sun Java 编码风格标准。
  • 找出解决方案后,开始遵循 Java 命名约定。
  • 我不明白我的编码风格有什么问题:S 是的,我编写了 Fortran、C++、Haskel、C、PHP、JS、Pascal、Delphi、x86-ASM 等。在 netbeans我按下右键然后格式化,这就是它给我的风格:S
  • @CantChooseUsernames 与许多语言不同,Java 是 documented set of conventions。在这种情况下,代码约定是(不完整的?)代码格式的超集。人们通常不太关心 Java 格式的差异,只要它以某种方式一致地缩进。

标签: java generics implicit explicit


【解决方案1】:

int 不是Object,所以int[] 不是Object[]

Integer[] I = new Integer[]{1, 2, 3, 4, 5};
WriteLine(I);

或者你应该为所有原始类型重载WriteLine

public static void WriteLine(int Array[]) {
...
public static void WriteLine(long Array[]) {
...

【讨论】:

  • 啊..盒装类型。我将改为重载所有原始类型。感谢您抽出宝贵时间回复。我会接受这个作为答案。我认为有一种方法可以显式调用特定的重载。
  • 这就是为什么有9个java.util.Arrays.toString方法。
【解决方案2】:

我会去的

System.out.println(Arrays.toString(myArray));

【讨论】:

    【解决方案3】:

    我会将您的数组命名为“Array”以外的名称,因为 Java 将 Array 类与 Object 或 T 泛型类混淆了。如果您只想打印数组的每个元素,您可能还需要考虑使用 StringBuilder。

    public static void write(Object arr[]) {
        for (int i = 0; i < arr.length; ++i) {
            System.out.println(arr[i]);
        }
    }
    

    应该够好了。

    如果你真的想使用 StringBuilder,然后打印,这样做:

    public static void write(Object arr[]) {
        sb = new StringBuilder();
        for (int i = 0; i < arr.length; ++i) {
            sb.append(arr[i] + " ");
        }
        System.out.println(sb.toString());
    }
    

    【讨论】:

    • 我也会给它起个别的名字,但这不是问题所在。 Array 可能甚至没有被导入,但这不会混淆编译器。例如:ideone.com/sFgpo7
    【解决方案4】:

    原始数组是 java.lang.Object 的子类型。重载在编译时解决,并选择最具体的方法,如果是 writeLine(Object text)。

    【讨论】:

      【解决方案5】:

      您有两种选择来确保调用正确的函数:

      1-

      Object[] objArray = new Object[] { 1, 2, 3, 4, 5 };
      

      2-

      Integer[] integerArray = new Integer[] { 1, 2, 3, 4, 5 };
      

      另外,您应该关注Java naming conventions。例如方法名应该是writeLine,循环中的索引变量应该是small case

      【讨论】:

      • 嗯.. 为什么是小盒子?我会这样做,但我不知道为什么小写对 java 如此重要?我正在阅读上面有人将我链接到 atm 的约定手册。就像你建议的那样,它似乎有很多小案例。只是为了风格?
      • 遵循语言命名约定使您的代码对其他程序员更具可读性,否则它可能看起来很奇怪和烦人。每种语言都有不同的命名约定,例如 WriteLine 对于像 C# 这样的语言是可以的,但在 Java 中应该是 writeLine
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-18
      • 2014-12-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多