【问题标题】:Java: Calling an interface's function from a Generic List that Extends itJava:从扩展它的通用列表中调用接口的函数
【发布时间】:2016-11-18 00:13:20
【问题描述】:

我想要一个对象列表,这些对象都继承自包含函数 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 方法。

【问题讨论】:

  • 您有List&lt;goers&gt; 还是List&lt;Class&lt;? extends goers&gt;&gt;?这很重要。 (第二个你不能打电话给.go(),第一个你可以。)
  • 更新问题,是第二个。
  • 您应该遵循 Java 命名约定。

标签: java generics arraylist interface


【解决方案1】:

List&lt;Class&lt;? extends goers&gt;&gt; 没有可以调用 .go()goers 实例。您只有类,而不是该类的任何实例。没有什么可以打电话给.go()

您可以尝试实例化这些类,或者首先使用List&lt;goers&gt;,这样您就可以将其称为接口的预期使用方式。

【讨论】:

  • @Andreas 这就是我所说的“尝试实例化这些类”的意思。
  • 是的,我在你添加第二段之前就写了。我的目的是让你也展示它的例子。 ;-)
  • 谢谢,我的大脑完全发呆,并认为您不能将界面作为列表类型并导致我的所有问题。我会尽快接受这个答案。
【解决方案2】:

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

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

您的基本问题是您正在使用反射,这是一种易于滥用且难以正确处理的高级技术。为什么不传递goers [原文如此- 遵循命名约定] 的实例列表而不是Class 对象?

【讨论】:

  • OP 没有(当前)使用反射。
  • List&lt;Class&lt;? extends goers&gt;&gt; 是反射。
猜你喜欢
  • 1970-01-01
  • 2022-11-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-08
  • 1970-01-01
相关资源
最近更新 更多