Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/311.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使方法在java中接受不同的参数数据类型?_Java - Fatal编程技术网

如何使方法在java中接受不同的参数数据类型?

如何使方法在java中接受不同的参数数据类型?,java,Java,我从问题中找到了下面的代码。到目前为止,它工作得很好,但我遇到了对字符串数组进行洗牌的需要。下面的代码只接受int数组作为参数。我对java还是很陌生,我似乎不知道如何让该方法在其参数中接受多个数据类型。如果我能用同样的方法洗牌整数数组和字符串数组,那就太好了。有人能帮忙吗 static int[] shuffle(int[] ar) { // If running on Java 6 or older, use `new Random()` on RHS here Random

我从问题中找到了下面的代码。到目前为止,它工作得很好,但我遇到了对字符串数组进行洗牌的需要。下面的代码只接受int数组作为参数。我对java还是很陌生,我似乎不知道如何让该方法在其参数中接受多个数据类型。如果我能用同样的方法洗牌整数数组和字符串数组,那就太好了。有人能帮忙吗

static int[] shuffle(int[] ar) {
    // If running on Java 6 or older, use `new Random()` on RHS here
    Random rnd = ThreadLocalRandom.current();
    for (int i = ar.length - 1; i > 0; i--)
    {
        int index = rnd.nextInt(i + 1);
        // Simple swap
        int a = ar[index];
        ar[index] = ar[i];
        ar[i] = a;
    }
    return ar;
}

Java通过使数组共变来解决这个问题。这意味着如果B是a的子类型,则B[]是a[]的子类型。这意味着您可以将参数类型设置为
Object[]
,并且可以传入任何对象数组。对于像
int
这样的基元类型,您仍然需要编写一个单独的方法,但是,因为基元不是对象。

这样使用泛型数组

static <T> T[] shuffle(T[] ar){
// If running on Java 6 or older, use `new Random()` on RHS here
    Random rnd = ThreadLocalRandom.current();
    for (int i = ar.length - 1; i > 0; i--)
    {
      int index = rnd.nextInt(i + 1);
      // Simple swap
      T a = ar[index];
      ar[index] = ar[i];
      ar[i] = a;
    }
    return ar;
}
(或)


您可以有两种不同的方法。一个洗牌整数数组,另一个洗牌字符串数组

static String[] shuffleStringArray(String[] ar){
    //method logic goes here
}
你的方法的基本结构不应该改变太多


祝你好运

对于不同的参数,应该有不同的方法。这将是方法重载

在您的情况下(对于字符串和int)

或者可以在方法的参数中使用对象数组。这样,您必须在调用方法中将int数组定义为整数类数组

static Object[] shuffle(Object[] array)
对象是Java中所有类的超类,子类“对象”可以通过超类引用处理


因为int是基元类型,而不是类,所以必须将int数组定义为整数数组。Integer是int的类型包装类。

您不能让一个方法对
int
数组和引用类型数组执行相同的操作,因为Java将它们视为完全不同的类型,并且它们的公共超类(
对象
)缺少数组的功能。然而,您似乎已经了解了(请参阅重载方法部分)。对于不同的参数,可以单独实现该方法。只需复制/粘贴代码,并将
int
的相关实例替换为
String
。这实际上是对
数组中的基元类型数组执行的操作。copyOf

如果需要同时支持对象和基元,则无法执行此操作。您需要为每个基元类型创建一个重载方法,为对象创建一个重载方法。此方法的每个版本都将使用不同的数据类型重新实现相同的算法

您的方法类似于java.util.Arrays类中的方法。请看一下开放JDK中的Arrays.java源代码


你想做什么
int[]
只能保存
int
值<代码>字符串[]只能保存<代码>字符串值。请参阅。。。洗牌通用数组但是如果我不想使用列表呢?我想使用字符串数组。@jthort-是的,我看到了,我的印象是OP认为
列表和数组是不兼容的数据结构。我刚才指出,
Arrays.asList()
提供的包装器将两者连接起来。无需重命名方法。超载在这里是可以的。他想把两者混在一起,而不是分开。用不同的方法执行这两种操作不会同时使用两种类型幸运的是,这对基元数组(
int
char
,等等)不起作用。这是真的,但我不确定OP是绝对想要使用基元还是只是洗牌一些整数(一个整数数组就可以了)。
static String[] shuffleStringArray(String[] ar){
    //method logic goes here
}
static int[] shuffle(int[] array)
static String[] shuffle(String[] array)
static Object[] shuffle(Object[] array)