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

Why am I unable to assign an embedded ArrayList<Integer> to a locally declared ArrayList<Integer>?

抱歉,如果标题不清楚,我的编程行话不是很好。

我有 2 个字符串 ArrayList 和一个从一个方法获得的整数 ArrayList,该方法通过 collection LinkedHashMap< String, List< String>>.但是,当我尝试将整数 ArrayList 设置为接收方法中声明的空 ArrayList 时,它显示语法错误:"incompatible types: List< String> cannot be converted to List< Integer>".

入门方法:

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);
            }
          }
}

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

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

LinkedHashmap<String, List<?>> readMap;

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

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

或投object.

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

然后在循环中施法

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

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

您应该拥有一个列表,其中包含一个 object 以及您需要的所有数据。

我可以想象思维过程是这样的,"I have these things, and they contain two strings and an integer. I will create a variable for each." 然后你问这个问题,"How do I create a collection of these things?"

这道题的错误答案是,"I will make a list for each value, and match associated values by index."正确答案是,"I will create a class to represent my data, and store that in a list."这是object东方编程的基本精髓(欢迎来到java) .

首先我们设计class:

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));

    }
}

您不能将 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) { ... }