我想创建一个通用方法,它可以采用 Integer、Float 或任何扩展 Number 的类型的 ArrayList。
public void mulBy2(ArrayList<? extends Number> list) {
// I want to multiply the value of each element in list by 2
// and store it back in list
for(int i = 0; i < al.size(); i++) {
Double d = al.get(i).doubleValue()*2;
al.set(i,d); // Obvious error here says required ? extends Number
// how to solve this issue
}
}
如果列表是值为 [2,3,4] 的 ArrayList,我的方法应该返回或创建值为 [4,6,8] 的 arrayList 最初为 [1.2,3.4] 的 ArrayList 应转换为 [2.4,6.8]
最佳答案
我们不想做你的作业,但我认为应该回答这个问题,因为它对 future 的访问者可能有用。解决方案应包括以下内容:
- 迭代元素
- 获取
class
当前元素的 - 调用
class
对应的方法当前元素的值来获取其值,因此如果它是Integer
,invoke
intValue
通过反射获取对象的值,将其乘以 2,并将列表中相应的元素设置为新值
有用的知识:
对应的方法有:
intValue
,longValue
,floatValue
,doubleValue
,byteValue
和shortValue
,类的名称或多或少与它们相关,例如Double
,Float
等等。参见这里:https://docs.oracle.com/javase/7/docs/api/java/lang/Number.html您可以获得
class
的Object
通过调用其getClass
方法。它的名称可以通过调用结果class
的 getEnwritingClass 来获得。 。示例:
Class<?> enclosingClass = getClass().getEnclosingClass();
if (enclosingClass != null) {
System.out.println(enclosingClass.getName());
} else {
System.out.println(getClass().getName());
}
- 通过反射,您可以调用invoke来调用方法。示例:
Class<?> c = Class.forName("class name");
Method method = c.getDeclaredMethod("method name", parameterTypes);
method.invoke(objectToInvokeOn, params);
祝你好运!
关于java - 创建一个通用方法来处理 Collection Java 以更改 ArrayList 的内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47819284/