我有3个这样的课程:
public class Subject {
String name;
ArrayList<Teacher> teachers;
public Subject(String name, ArrayList<Teacher> teachers) {
init();
this.name = name;
this.teachers = teachers;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public ArrayList<Teacher> getTeachers() {
return teachers;
}
public void setTeachers(ArrayList<Teacher> teachers) {
this.teachers = teachers;
}
//
private void init() {
this.teachers = new ArrayList<>();
}
}
public class Teacher {
String name;
ArrayList<DLink> dLinks;
public Teacher(String name, ArrayList<DLink> dLinks) {
init();
this.name = name;
this.dLinks = dLinks;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public ArrayList<DLink> getdLinks() {
return dLinks;
}
public void setdLinks(ArrayList<DLink> dLinks) {
this.dLinks = dLinks;
}
//
private void init() {
this.dLinks = new ArrayList<>();
}
}
和
public class DLink {
String URL;
public DLink(String URL) {
this.URL = URL;
}
public String getURL() {
return URL;
}
public void setURL(String URL) {
this.URL = URL;
}
}
我正在尝试创建一些ArrayList<Subject>
,但我不知道该怎么做。我试着这样做:
ArrayList<Subject> subjects = new ArrayList<>();
subjects.add(new Subject("S1", new ArrayList<Teacher>().add(new Teacher("T1", new ArrayList<DLink>().add(new DLink("D1")))));
但是我遇到了语法错误。我想知道操作Subject类objects
的正确语法以及如何添加ArrayList<Teacher>
&amp;的多个值。对于Subject类的对象,在一行中ArrayList<DLink>
。
感谢...
答案 0 :(得分:1)
ArrayList不是builder。构建器是一个在方法中返回自身的类,因此您可以执行以下操作:
new SomeClass().someField().someField().build()
并在最终返回时获取SomeClass
的实例。
ArrayList 不是构建器。这意味着返回值本身并不是每个方法。
当你这样做时:
new ArrayList<SomeClass>();
您创建一个新的ArrayList实例。
但是,如果您这样做:
new ArrayList<SomeClass>().add(new SomeClass());
创建一个新实例,然后添加一些内容。的然而强>
add
的返回值为boolean
。不是ArrayList
。这意味着当你调用该方法时,返回一个布尔值,而不是一个ArrayList。当你像那样堆叠它时,它类似于:
someINstance.getField()/*returns an instance of a class*/.someInteger/*now you grab an integer*/
为了解决这个问题,你必须单独创建ArrayList:
ArrayList<Subject> subjects = new ArrayList<>();
List<Teacher> teachers = new ArrayList<>();
//then add to the ARrayList
List<DLink> dLinks = new ArrayList<DLink>();
dLinks.add(new DLink("D1"));
teachers.add(new Teacher("T1", dLinks);
subjects.add(new Subject("S1", teachers));
这是一种非常低效的方法,但是当ArrayList(或任何列表)不是构建器
时,这是唯一的选择。 TL:DR; 因为ArrayList不是构建器,所以当您调用.add
时,您不会获得List的实例,这意味着您必须单独拥有该实例,它无法像你尝试的那样被创建并立即添加值,因为该方法是boolean
意味着它不会返回ArrayList的实例
我想说的代码示例:
public static void main(String[] args){
int x = someMethod();
}
public static void someMethod(){
System.out.println("whatever");
}
与ArrayLists相同。第一部分为您提供了一个实例,但是您会得到一个返回类型的void,这意味着您不会从最终代码中获取任何实例。
不,没有办法在一行中做到这一点,至少在Java 8及以下版本中没有。
答案 1 :(得分:0)
键入
时subjects.add(new Subject("S1", new ArrayList<Teacher>().add(new Teacher("T1", new ArrayList<DLink>().add(new DLink("D1")))));
你基本上是在说'subjects.add(新主题(“S1”,真),真)' 因为你没有将引用传递给数组,所以你传递的是add方法的结果,如果add没有给出任何问题,那么根据java doc返回true。
请改为尝试:
ArrayList<Dlink> dlinkList = new ArrayList<>();
dlinkList.add("Test.url");
ArrayList<Teacher> teacherList = new ArrayList<>();
teacherList.add(new Teacher("Example name", dlinkList));
ArrayList<Subject> subjects = new ArrayList<>();
subjects.add(new Subject("S1", teacherList);