如何拆分 Java 对象的元素?
How to split the elements of a Java Object?
这可能是一个愚蠢的问题,但由于我对 Java 缺乏了解(仍然是初学者),我需要一些帮助来阅读对象的元素。有一种方法不仅返回实体,还返回字符串,我不能 read/iterate 它。我尝试了一些来自 Internet 的解决方案,但其中 none 可以满足我的需要。我可能做错了什么,如果这是一个愚蠢的问题,再次抱歉。
让我准确地分享方法返回的内容
here
如您所见,我在位置 0 上有 ChecklistRequest,在位置 1 上有一个字符串 ("--")。我需要阅读它们,因为我需要在这一点之后操作它们。
提前致谢!
要获取对象的特定元素,可以使用格式"objectName.certainElement"
然而,很多时候,实际变量是私有的,因此您不能从 class 本身之外访问它们。 class 必须提供 "getters and setters",您将调用 objectName.getElement() 以获得该特定元素。
在您的例子中,requests 是一个充满 E 的 DistinctResultList。我敢打赌 DistinctResultList 只是 ArrayList 的包装器。为了得到你要找的对象,你必须这样做。
checklistRequest = requests.get(0)[0]; //Get the first object at position 0 of arraylist, then the index at position 0 of that object.
secondString = requests.get(0)[1];
编辑它们的值,假设它们是public,
request.get(0)[0] = otherChecklistRequest;
request.get(0)[1] = "---";
或者,创建一个新对象并设置索引:
request.set(0, new myObject(otherChecklistRequest, "----"));
当然,您必须修改所有这些以适合您的用例。
不同的对象有不同的方法来获取隐藏在其中的元素。在本例中,ArrayList 使用 getter 方法,并以索引作为参数。里面的对象好像只是一个用括号的数组。
祝你好运,希望我能帮到你,或者至少为你指明了正确的方向!
你看到的是存储在内部是一个ArrayList<Object[]>
。虽然您始终可以将 Object
设置为任何类型的其他对象,但如果您想阅读它,则需要显式转换:
Integer i1=1; // upper case Integer (not int), so it is an object
Object o1=i1; // setting Object to any object is okay
//Integer i2=o1; // this will not compile
Integer i2=(Integer)o1; // this will work fine
if(o1 instanceof Integer)
System.out.println("o1 is Integer: "+(Integer)o1*2);
if(o1 instanceof Double)
System.out.println("o1 is Double: "+(Double)o1*2);
System.out.println("passed the ifs, let's die");
Double d1=(Double)o1; // this will result in ClassCastException in runtime
(https://ideone.com/qdGtJP)
这就是为什么您不能对 request.get(0)[0]
的结果进行 see/do 操作,因为那仍然是 Object
,而不是 String
或 CheckListRequest
。它需要特定的转换(请注意 Java 中有一个 instanceof
运算符,因此您可以检查某些东西是否真的如您所想 - 因为当它是其他东西时,转换尝试将会失败)
E
-s 只是代表 ***E***lement,您可以在文档中随处看到,例如 https://docs.oracle.com/en/java/javase/12/docs/api/java.base/java/util/List.html:
Module java.base
Package java.util
Interface List<E>
Type Parameters:
E - the type of elements in this list
当 运行、Java 没有真正跟踪您为容器类型指定的内容时,它会将任何内容放入 List
对象中,然后死掉并显示出惊讶脸:
List<Integer> il=new ArrayList<>();
//il.add(new Object()); // this would not compile
List l=il;
l.add(new Object()); // this compiles, and runs, so add() does not complain
System.out.println("Length: "+il.size());
System.out.println(il.get(0)+3);
又特地用了一个ClassCastException
,所以List<Integer>
内部知道它只是存储对象,只有编译器为我们生成一个方便的转换,所以我们可以假装List<Integer>
里面有 Integer
s。但事实并非如此。
旁注 1:这就是 List<int>
不存在的原因:它需要对象
旁注 2:对于字段,可以通过反射获取其 "type parameters"(<E>
)。
要重现屏幕截图上的类似结构:
public class Test {
public static class CheckListRequest {}
public static void main(String[] args) {
List<Object[]> array=new ArrayList<>();
array.add(new Object[] {new CheckListRequest(),"--"});
array.add(new Object[2]);
System.out.println("Test");
// would not compile, Object has no length()
//System.out.println(array.get(0)[1].length());
// compiles and runs just fine
System.out.println(((String)array.get(0)[1]).length());
}
}
如果您在 Test
行放置一个断点,您可以在调试器中看到非常相似的结构。
这可能是一个愚蠢的问题,但由于我对 Java 缺乏了解(仍然是初学者),我需要一些帮助来阅读对象的元素。有一种方法不仅返回实体,还返回字符串,我不能 read/iterate 它。我尝试了一些来自 Internet 的解决方案,但其中 none 可以满足我的需要。我可能做错了什么,如果这是一个愚蠢的问题,再次抱歉。
让我准确地分享方法返回的内容 here
如您所见,我在位置 0 上有 ChecklistRequest,在位置 1 上有一个字符串 ("--")。我需要阅读它们,因为我需要在这一点之后操作它们。
提前致谢!
要获取对象的特定元素,可以使用格式"objectName.certainElement"
然而,很多时候,实际变量是私有的,因此您不能从 class 本身之外访问它们。 class 必须提供 "getters and setters",您将调用 objectName.getElement() 以获得该特定元素。
在您的例子中,requests 是一个充满 E 的 DistinctResultList。我敢打赌 DistinctResultList 只是 ArrayList 的包装器。为了得到你要找的对象,你必须这样做。
checklistRequest = requests.get(0)[0]; //Get the first object at position 0 of arraylist, then the index at position 0 of that object.
secondString = requests.get(0)[1];
编辑它们的值,假设它们是public,
request.get(0)[0] = otherChecklistRequest;
request.get(0)[1] = "---";
或者,创建一个新对象并设置索引:
request.set(0, new myObject(otherChecklistRequest, "----"));
当然,您必须修改所有这些以适合您的用例。
不同的对象有不同的方法来获取隐藏在其中的元素。在本例中,ArrayList 使用 getter 方法,并以索引作为参数。里面的对象好像只是一个用括号的数组。
祝你好运,希望我能帮到你,或者至少为你指明了正确的方向!
你看到的是存储在内部是一个ArrayList<Object[]>
。虽然您始终可以将 Object
设置为任何类型的其他对象,但如果您想阅读它,则需要显式转换:
Integer i1=1; // upper case Integer (not int), so it is an object
Object o1=i1; // setting Object to any object is okay
//Integer i2=o1; // this will not compile
Integer i2=(Integer)o1; // this will work fine
if(o1 instanceof Integer)
System.out.println("o1 is Integer: "+(Integer)o1*2);
if(o1 instanceof Double)
System.out.println("o1 is Double: "+(Double)o1*2);
System.out.println("passed the ifs, let's die");
Double d1=(Double)o1; // this will result in ClassCastException in runtime
(https://ideone.com/qdGtJP)
这就是为什么您不能对 request.get(0)[0]
的结果进行 see/do 操作,因为那仍然是 Object
,而不是 String
或 CheckListRequest
。它需要特定的转换(请注意 Java 中有一个 instanceof
运算符,因此您可以检查某些东西是否真的如您所想 - 因为当它是其他东西时,转换尝试将会失败)
E
-s 只是代表 ***E***lement,您可以在文档中随处看到,例如 https://docs.oracle.com/en/java/javase/12/docs/api/java.base/java/util/List.html:
Module java.base
Package java.util
Interface List<E>Type Parameters:
E - the type of elements in this list
当 运行、Java 没有真正跟踪您为容器类型指定的内容时,它会将任何内容放入 List
对象中,然后死掉并显示出惊讶脸:
List<Integer> il=new ArrayList<>();
//il.add(new Object()); // this would not compile
List l=il;
l.add(new Object()); // this compiles, and runs, so add() does not complain
System.out.println("Length: "+il.size());
System.out.println(il.get(0)+3);
又特地用了一个ClassCastException
,所以List<Integer>
内部知道它只是存储对象,只有编译器为我们生成一个方便的转换,所以我们可以假装List<Integer>
里面有 Integer
s。但事实并非如此。
旁注 1:这就是 List<int>
不存在的原因:它需要对象
旁注 2:对于字段,可以通过反射获取其 "type parameters"(<E>
)。
要重现屏幕截图上的类似结构:
public class Test {
public static class CheckListRequest {}
public static void main(String[] args) {
List<Object[]> array=new ArrayList<>();
array.add(new Object[] {new CheckListRequest(),"--"});
array.add(new Object[2]);
System.out.println("Test");
// would not compile, Object has no length()
//System.out.println(array.get(0)[1].length());
// compiles and runs just fine
System.out.println(((String)array.get(0)[1]).length());
}
}
如果您在 Test
行放置一个断点,您可以在调试器中看到非常相似的结构。