如何将不同类型的ArrayList传递给方法?

时间:2014-02-23 05:25:27

标签: java types arraylist

我想定义一个方法 -

public static void summary1(ArrayList<Type> a){
    //some code        
}

我希望能够灵活地将“Type”替换为任何东西(Integer,Double,Long等)。这可能吗?

5 个答案:

答案 0 :(得分:4)

public static <T> void summary1(ArrayList<T> list){
   //now you can pass any list here
}

如果您想以某种方式使用T

或者您可以使用通配符运算符?,如果您不关心将List传递给summary1

的类型

参考文献:   - Generics and wildcard

答案 1 :(得分:3)

您可以使用<?>表示法作为

public static void summary1(ArrayList<?> a){
    //some code        
}

另外,如果您想限制为Number的子类型,可以添加

public static void summary1(ArrayList<? extends Number> a){
    //some code        
}

答案 2 :(得分:2)

是的,您必须使用通配符?。所以ArrayList<?>意味着任何东西的ArrayList。通过你写的,我假设你只想要数字,所以你可以做ArrayList<? extends Number>这样的事情,这样你就只能传递扩展数字的类的数组。

答案 3 :(得分:2)

如果你的字面意思是“任何东西”,并且你不需要访问该方法中的类型:

public static void summary1(List<?> list){
}

如果您需要访问类型:

public static <T> void summary1(List<T> list){
    // type T is available to code in here
}

您的所有示例都是Number个类,因此如果您想将其限制为:

public static <T extends Number> void summary1(List<T> list){
   // a list of Numbers
}

如果您还需要Comparable所有Number个类的行为(但仅Number没有):

public static <T extends Number & Comparable<T>> void summary1(List<T> list){
   // a list of Numbers, and you can compare them
}


另请注意,我已将类型更改为抽象类型List,而不是实现ArrayList - 请参阅Liskov substitution principle

答案 4 :(得分:0)

我不是Java专家,但据我所知,您需要为您希望看到的每种类型显式创建方法。例如:

public static void summary1(ArrayList<String> a){
    //some code        
}

public static void summary1(ArrayList<Integer> a){
    //some code        
}

public static void summary1(ArrayList<Double> a){
    //some code        
}

etc...

然后在调用方法时,将根据传递给它的类型调用正确的方法。