如何拆分 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,而不是 StringCheckListRequest。它需要特定的转换(请注意 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> 里面有 Integers。但事实并非如此。
旁注 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 行放置一个断点,您可以在调试器中看到非常相似的结构。