为什么我无法将嵌入的ArrayList <integer>分配给本地声明的ArrayList <integer>?

时间:2016-04-07 08:51:09

标签: java arraylist linkedhashmap

如果标题不清楚,我很抱歉,我的编程术语不太好。

我有两个字符串ArrayLists和一个从一个方法获得的整数ArrayList,它通过集合传递给一个单独的方法 LinkedHashMap&lt;字符串,列表&lt;串GT;&GT; 即可。但是,当我尝试将整数ArrayList设置为接收方法中声明的空ArrayList时,它会显示语法错误:&#34;不兼容的类型: List&lt;字符串&gt; 无法转换为列表&lt;整数&GT; &#34;

入门方法:

public static void main(String[] args) {

    try{

    LinkedHashMap lhm = new LinkedHashMap();
    List<String> listEPC = new ArrayList<String>();
    List<String> listTimeStamp = new ArrayList<String>();
    List<Integer> listAntenna = new ArrayList<Integer>();

    String tagID = "EQ5237";
    String TimeStampStr = "12:23:22";
    int tagAntenna = 2;        

            listEPC.add(tagID);
            listTimeStamp.add(TimeStampStr);
            listAntenna.add(tagAntenna);

            lhm.put("epcs", listEPC);
            lhm.put("timestamps", listTimeStamp);
            lhm.put("antennas", listAntenna);

   insertData insert = new insertData();
   insert.insertData(lhm);                    //send map with values to new method

    }catch(Exception e){
    e.printStackTrace();
    }
}

接收方式:

public class insertData {

    public void insertData(LinkedHashMap<String, List<String>> readMap) {

            List<String> listEPC = new ArrayList<String>();
            List<String> listTimeStamp = new ArrayList<String>();
            List<Integer> listAntenna = new ArrayList<Integer>();

            String EPC = null;
            String TimeStamp = null;
            Integer Antenna = null;

            listEPC = readMap.get("epcs");
            listTimeStamp = readMap.get("timestamps");
            listAntenna = readMap.get("antennas");      //error message here

            for(int i=0; i<readMap.size(); i++){

                EPC = listEPC.get(i);
                TimeStamp = listTimeStamp.get(i);
                Antenna = listAntenna.get(i);

                System.out.println("Entry " + i );
                System.out.println("Values: " + EPC + TimeStamp + Antenna);
            }
          }
}

此代码仅在我将所有整数实例更改为字符串时才有效,这不是我在实际代码中所希望的。为什么会这样,我该如何解决呢?

2 个答案:

答案 0 :(得分:3)

您无法将List<String>分配给List<Integer>。元素基本上是不同的类型。

您需要构建一个新的List

List<Integer> listOfIntegers = new ArrayList<>();
for (String entry : listOfStrings) {
  listOfIntegers.add(Integer.valueOf(entry);
}

当然,您还需要处理列表元素无法解析为整数的可能性。

但是,您只是通过将所有内容填充到单个地图中来丢弃类型信息。最好分别传递三个列表:

insertData(listEPC, listTimestamp, listAntenna);

然后您可以在方法签名中使用不同的列表类型:

void insertData(
    List<String> listEPC,
    List<String> listTimestamp,
    List<Integer> listAntenna) { ... }

答案 1 :(得分:1)

我将在底部包含正确的答案,但就您的问题标题而言,您必须将您的方法签名更改为:

LinkedHashmap<String, List<?>> readMap;

然后要么强制转换列表,这会导致不安全的转换。例如

List<String> listEPC = (List<String>)readMap.get("epcs");

或投射物体。

List<?> listEPC = readMap.get("epcs");

然后在循环演员中。

 EPC = (String)listEPC.get(i);

注意,这些不是好的解决方案。

您应该拥有的是一个List,其中包含一个包含您需要的所有数据的对象。

我可以想象思维过程沿着这些方向发展,“我有这些东西,它们包含两个字符串和一个整数。我将为每个创建一个变量。”然后你问一个问题,“我如何创建这些东西的集合?”

这个问题的错误答案是,“我将为每个值创建一个列表,并按索引匹配关联的值。”正确的答案是,“我将创建一个类来表示我的数据,并将其存储在列表中。”这是面向对象编程的基本要素(欢迎使用java)。

首先我们设计课程:

class EPCThing{
    String EPC;
    String timeStamp;
    int Antennas;

    public EPCThing(String tagId, String timeStamp, int antennas){
        EPC=tagId;
        this.timeStamp = timeStamp;
        Antennas = antennas;
    }

    @Override
    public String toString(){
        return "Values: " + EPC + TimeStamp + Antenna
    }

}

现在你的程序的主要方法就像是。

List<EPCThing> things = new ArrayList<>();

String tagID = "EQ5237";
String TimeStampStr = "12:23:22";
int tagAntenna = 2;        

EPCThing thing = new EPCThing(tagID, TimeStampStr, tagAntenna);
things.add(thing);

insertData insert = new insertData();
insert.insertData(things);

然后我们可以修复你的insertData方法

public void insertData(List<EPCThing> things) {

    for(int i=0; i<things.size(); i++){

            System.out.println("Entry " + i );
            System.out.println("Values: " + things.get(i));

    }
}