如果标题不清楚,我很抱歉,我的编程术语不太好。
我有两个字符串ArrayLists和一个从一个方法获得的整数ArrayList,它通过集合传递给一个单独的方法 LinkedHashMap<字符串,列表<串GT;> 即可。但是,当我尝试将整数ArrayList设置为接收方法中声明的空ArrayList时,它会显示语法错误:"不兼容的类型: List<字符串> 无法转换为列表<整数> "
入门方法:
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);
}
}
}
此代码仅在我将所有整数实例更改为字符串时才有效,这不是我在实际代码中所希望的。为什么会这样,我该如何解决呢?
答案 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));
}
}