如何拆分 Java 对象的元素?



这可能是一个愚蠢的问题,但由于我对Java缺乏了解(仍然是初学者(,我需要一些帮助来阅读对象的元素。有一个方法不仅返回实体,还返回字符串,我无法读取/迭代它。我已经尝试了互联网上的一些解决方案,但没有一个像我需要的那样工作。我可能做错了什么,所以如果这是一个愚蠢的问题,再次抱歉。

让我确切地分享该方法返回的内容 这里

如您所见,我在位置 0 上有清单请求,在位置 1 上有一个字符串 ("--"(。我需要阅读它们,因为在此之后我需要操作它们。

提前感谢!

要获取对象的特定元素,可以使用格式"objectName.certainElement"

但是,很多时候,实际变量是私有的,因此您无法从类本身外部访问它们。该类必须提供"getters and setters",您可以调用objectName.getElement((来获取该特定元素。

在你的例子中,请求是一个充满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];

要编辑它们的值,假设它们是公共的,

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]的结果进行操作,因为这仍然是一个Object,而不是一个StringCheckListRequest。它需要特定的强制转换(请注意,Java 中有一个instanceof运算符,因此您可以检查某些东西是否真的是你认为的那样 - 因为当它是其他东西时,转换尝试就会死亡(

E-s 只是站在那里 ***E****lement,你可以在文档中的任何地方看到,如 https://docs.oracle.com/en/java/javase/12/docs/api/java.base/java/util/List.html:

Modulejava.base
Packagejava.util
Interface List

类型参数:
E - 此列表中的元素类型

运行时,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
旁注1:这就是为什么List<int>不存在的原因:它需要对象
旁注2:在字段的情况下,可以通过反射获得其"类型参数"(<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-行处放置断点,则可以在调试器中看到非常相似的结构。

最新更新