【问题标题】:How to create a method that can take in multiple classes as input如何创建一个可以将多个类作为输入的方法
【发布时间】:2015-10-09 00:54:06
【问题描述】:

举个例子:

public static String[] multipleOfSameSet(String var,int setLength){
    String[] out = new String[setLength];
    for(int i=0; i<setLength; i++){
        out[i] = var;
    }
    return out;
}

但我希望它适用于 int、double 和大约 10 个其他类。 我尝试使用一个类来代替 String,它给了我一个错误的世界。这里:

有没有可能??如果是,我该怎么做?

【问题讨论】:

  • 答案叫generic types
  • 您这样做是为了达到什么目的?您可以使用通用类“Object”,但可能有更好的方法来做任何您想做的事情。
  • 答案也称为基于协议的开发...确保您的各种输入类型实现了必要的接口。
  • intdouble 不是类。
  • @immibis int 和双 ARE 类。尝试整数 x = new Integer(5)

标签: java android methods


【解决方案1】:

是的,这是可能的。一种选择是尝试找到一个类,它是您要使用的所有类的超类,或者是所有类实现的接口。在您的情况下,唯一的候选对象可能是 Object:

public static Object[] multipleOfSameSet(Object var, int setLength) {
    Object[] out = new Object[setLength];
    for(int i = 0; i < setLength; i++) {
        out[i] = var;
    }
    return out;
}

这将起作用,因为所有 Java 类都直接或间接地扩展 Object。原始值自动转换为对象(整数变为 Integers,双精度变为 Doubles 等等)。

这种方法的缺点是,你会得到一个对象数组,而你对它们无能为力。您可能要考虑的是让您的方法接受一些泛型类型 T,并返回 T 的 ArrayList:

public static <T> ArrayList<T> multipleOfSameSet(T object, int setLength) {
    ArrayList<T> out = new ArrayList<T>();
    for(int i = 0; i < setLength; i++) {
        out.add(object);
    }
    return out;
}

但是,如果您以后不需要修改列表,我会这样做:

public static <T> List<T> multipleOfSameSet(T object, int setLength) {
    return Collections.nCopies(setLength, object);
}

【讨论】:

  • 这是一个糟糕的解决方案。它迫使你使用projections
  • @Laszlowaty 它有效,但你为什么说这是不好的解决方案,什么是预测?
  • 当你将你的对象转换为一些在运行时我不正确的具体类时,它会导致类转换异常
  • 我现在确定我使用了正确的词。预测正在改变变量的类型。例如:double a;double b; int c = (int)a/b;
  • @Laszlowaty 啊,你在考虑casts。我添加了第二个示例,它为您提供了一个类型化的 ArrayList。
【解决方案2】:

您可以使用接口或定义的类类型..

public static MyInterface[] multipleOfSameSet(MyInterface var, int setLength) {
    MyInterface[] out = new MyInterface[setLength];
    for(int i = 0; i < setLength; i++) {
        out[i] = var;
    }
    return out;
}

【讨论】:

    猜你喜欢
    • 2014-02-09
    • 2010-12-10
    • 1970-01-01
    • 2017-09-06
    • 2017-06-22
    • 2023-01-04
    • 2022-01-01
    • 2021-07-30
    • 1970-01-01
    相关资源
    最近更新 更多