我想定义一个方法 -
public static void summary1(ArrayList<Type> a){
//some code
}
我希望能够灵活地将“Type”替换为任何东西(Integer,Double,Long等)。这可能吗?
答案 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...
然后在调用方法时,将根据传递给它的类型调用正确的方法。