Java - List,数组类型的东西不同类型的对象?



我有一堆java类它们的结构是这样的

class Something {
public static String name;
public static String description;
public void run(String[] args);
}

问题是,它们都是不同的类型。因此,如果我尝试创建它们的哈希集并遍历它们

HashSet<Object> things = new HashSet<Object>();
things.add(new Something());
things.add(new Otherthing());
things.forEach(thing -> {
thing.run();
})

它给出这个错误

symbol:   variable run
location: variable thing of type java.lang.Object

那么我如何创建这些对象的可迭代集合并使用它们的属性呢?

它们需要具有相同的类型才能像那样使用。幸运的是,我们可以通过实现一个合适的函数接口来解决这个问题。

public class Something implements Runnable {
public String name;
public String description;
@Override
public void run() {
System.out.println("something");
}
}

Runnable有一个方法run(),它不接受任何参数,也不返回任何东西(也就是说它必须一些事情)。

所以这只适用于当你实际上不打算使用字符串数组作为参数,因为你不包括它在你的运行()调用。然而,如果你确实需要它,你必须将实现的接口改为Consumer而不是Runnable,用accept()代替,因为这个方法实际上接受一个参数,而不是run()。

public class Main {
public static void main(String[] args) {
HashSet<Runnable> things = new HashSet<>();
things.add(new Something());
things.add(new Something2());
things.forEach(thing -> {
thing.run();
});
}
}

现在,我们将HashSet设置为实现接口的类型,并且它工作了!

这是另一个类:

public class Something2 implements Runnable {
public String name;
public String description;
@Override
public void run() { 
System.out.println("something2");
}
}

现在您可以创建任意多的类,并让它们的方法做不同的事情,同时仍然能够将它们聚集在同一个集合中(只要它们实现相同的类型)!

旁注:如果你不需要这些属性,你可以使用lambda表达式来实现不同版本的run()(或accept(),或任何其他功能接口方法)。

最新更新