有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

Java:从扩展接口的通用列表调用接口的函数

我想要一个对象列表,所有对象都从包含函数go()的同一接口继承

public interface goers{
    public void go();
}

现在我有3个类都实现了go,为了简单起见,我们把它们叫做A、B和C

在另一个类中,我有一个我想做的List<Class<? extends goers>>

for (Class<? extends goers> gos : list)
    {
        gos.go();
    }

但它不会编译,因为编译器不会从应用于列表所有成员的接口中提取go方法


共 (2) 个答案

  1. # 1 楼答案

    因为go()不是Class<T>的方法,所以不能在Class<T>的实例上调用该方法。只能使用https://docs.oracle.com/javase/8/docs/api/java/lang/Class.html的方法

    如果您想要一个goers[sic-遵循命名约定]的实例,您需要以某种方式获得一个。例如,您可以使用https://docs.oracle.com/javase/8/docs/api/java/lang/Class.html#newInstance

    你的根本问题是你在使用反射,这是一种很容易被滥用而且很难纠正的先进技术。为什么不传递goers[sic-遵循命名约定]而不是Class对象的实例列表

  2. # 2 楼答案

    List<Class<? extends goers>>没有可调用的goers实例。您只有类,而不是该类的任何实例。没有什么可以调用的

    您可以尝试实例化这些类,或者首先使用一个List<goers>,它允许您调用接口的使用方式