为什么我无法将嵌入的 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) { ... }
抱歉,如果标题不清楚,我的编程行话不是很好。
我有 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) { ... }