【问题标题】:Call a method from arraylist element从 arraylist 元素调用方法
【发布时间】:2014-09-14 17:58:36
【问题描述】:

我是 Java 新手,我完全坚持它。 我必须实现“summator”类,对其中的所有数字求和。 例如这个类包含一个数字

public class NumericNode <N extends Number>{    
    private N nodeValue = null;
    public NumericNode(N initValue){
        this.nodeValue = initValue;
    }
    public N getNodeValue() {
        return nodeValue;
    }
}

第二课需要做一些总结

public class NumericSummatorNode<NumericNode, T> {    
    private T nodeValue;
    private NumericNode[] inlets;
public NumericSummatorNode(NumericNode...inlets) {
        this.summ(inlets);
    }//constructor
public void summ(NumericNode... summValues) {
        ArrayList<NumericNode> numericList = new ArrayList<>();       
        int count = summValues.length;
        for (int i = 0; i < count; i++){
           numericList.add(summValues[i]);
        }
       for (int j = 0; j < count; j++){
           Method method = numericList.get(j).getClass().getMethod("getNodeValue", null);
           method.invoke(numericList.get(j), null);
        }    
     }

这里是主要的:

public static void main(String[] args){
        NumericNode n1 = new NumericNode(5);
        NumericNode n2 = new NumericNode(4.3f);
        NumericNode n3 = new NumericNode(24.75d);
        NumericNode n5 = new NumericNode((byte)37);
        NumericNode n6 = new NumericNode((long)4674);
        NumericSummatorNode s1 = new NumericSummatorNode(5, 4.6f, (double)4567);
        NumericSummatorNode s2 = new NumericSummatorNode(n1, n2);
        NumericSummatorNode s3 = new NumericSummatorNode();        
        s2.summ(n1, n2);        
    }//main

所以我在从数组列表中的 NumericNode 对象调用 getNodeValue() 方法时遇到了问题。 我该如何完成这项工作?

【问题讨论】:

标签: java reflection methods arraylist


【解决方案1】:

您需要查看异常的内容,它会告诉您什么是错误的。异常可能是:

java.lang.NoSuchMethodException: java.lang.Integer.getNodeValue()

所以列表显然包含整数,尽管看起来ArrayList&lt;NumericNode&gt; 应该只包含NumericNode。这怎么可能发生?如果我在eclipse中运行它,它也会显示这个警告:

类型参数NumericNode隐藏了类型NumericNode

这是因为类被声明为

public class NumericSummatorNode<NumericNode, T>

NumericNode 是一个类型参数,不幸的是它与NumericNode 类同名。这意味着它隐藏了真正的 NumericNode 类,你不能再使用它了。这也是new NumericSummatorNode(5, 4.6f, (double) 4567)连编译的原因。您不能只将任何 Number 传递给实际采用 NumericNode 的构造函数。

因此将其重组为NumericSummatorNode&lt;T&gt;NumericSummatorNode&lt;N extends NumericNode, T&gt; 或任何您的意图,因此它不会隐藏任何类。它不会再编译了,因此您还需要调整构造函数和 sum 方法的类型。使用泛型也很好,但是如果你使用原始类型,它们是不是有点没用。

【讨论】:

  • 感谢您的明确解释。没错,你是对的。我在“summator”类中重新编写了我的代码,它现在可以使用 ArrayList 并从列表中调用方法。问题归结为简单的反射示例)))
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-04-19
  • 2014-03-10
  • 1970-01-01
  • 1970-01-01
  • 2018-11-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多