java 列表,数组类型的东西不同类型的对象?

k4ymrczo  于 2022-12-02  发布在  Java
关注(0)|答案(1)|浏览(182)

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

class Something {
    public static String name;
    public static String description;

    public void run(String[] args);
}

问题是,它们都是不同的类型。所以如果我尝试创建它们的HashSet并遍历它们

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

那么,我怎样才能创建这些对象的可迭代集合并使用它们的属性呢?

l0oc07j2

l0oc07j21#

幸运的是,我们可以通过实现一个合适的函数接口来解决这个问题。

public class Something implements Runnable {

    public String name;
    public String description;

    @Override
    public void run() {

        System.out.println("something");

    }

}

Runnable有一个run()方法,它不接受参数,也不返回任何东西(也就是说,它必须做一些事情)。
因此,只有当你实际上并不打算将String数组作为参数使用时,这才有效,因为你在调用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(),或任何其他函数接口方法)。

相关问题