2015-07-20 58 views
1

举例来说,一种方法:如何创建可以在多个类作为输入

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和其他十类工作。 我尝试使用类代替字符串,它给了我一个错误的世界。这里:

甚至有可能吗?如果是的话,我该怎么做?

+0

答案被称为[泛型类型(https://docs.oracle.com/javase/tutorial/java/泛型/ types.html) – Laszlowaty

+0

你是什么要通过这样做来完成?你可以使用泛型类“对象”,但可能有更好的方法来做任何你想要做的事情。 – Zarwan

+0

答案也被称为基于协议的开发...确保您的各种输入类型实现必要的接口。 – BonanzaDriver

回答

3

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

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。原始值自动转换为对象(int变成Integer s,双倍变成Double s等等)。

这种方法的不足之处在于,你得到一个对象数组,并且你可以用这些做的事情不多。你可能要考虑是不是让你的方法接受一些泛型类型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); 
} 
+0

这是不好的解决方案。它迫使你使用'预测'。 – Laszlowaty

+0

@Laszlowaty它的工作原理,但你为什么说这是不好的解决方案,什么是预测? – kbluue

+0

当您将对象投射到某个在运行时无法正确运行的具体类时,它会导致类抛出异常 – Constantin

0

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

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; 
} 
相关问题