【问题标题】:Passing Abstract Class in Java在 Java 中传递抽象类
【发布时间】:2014-05-30 13:54:07
【问题描述】:

试图从实例类中的抽象类调用静态方法。这是我正在尝试做的原始编码示例,但不知道如何去做。

DataSource myDataSource = new DataSource();
DataAdapterTest.initialize(myDataSource);

public abstract class DataAdapterTest extends DataAdapter {
    public static void initialize(DataSource d) {
        d.addDataAdapter(DataAdapterTest.class);
    }

    public static void onCreate() {
        does something here
    }
}

public class DataSource {
    public void addDataAdapter(Class<DataAdapter> c) {
        c.onCreate();
    }
}

【问题讨论】:

  • IMO,不清楚你的问题是什么。
  • 在方法签名中使用抽象类没有问题;唯一真正的问题是不能实例化(即new)抽象类。 “真正的问题”似乎是关于Class&lt;DataAdapterTest&gt;Class&lt;DataAdapter&gt; 之间的[co] 差异,这实际上与List&lt;String&gt; 不能与List&lt;Object&gt; 分配的原因相同——无论如何,包括相关的[编译器]错误。
  • Class 对象不能以这种方式使用(反射除外,这可能是处理您正在做的任何事情的一种非常混乱的方式)。所以你需要告诉我们更多你想要做什么。

标签: java parameter-passing abstract-class


【解决方案1】:

您的问题不清楚。我会回答我猜的问题。

签名编译错误

我猜你有以下编译错误:

类型中的方法addDataAdapter(Class) Main.DataSource 不适用于参数 (类)

只需为addDataAdapter() 使用更宽的签名

public void addDataAdapter(Class<? extends DataAdapter> c) {

onCreate 调用

您似乎正在尝试对静态方法使用多态性,这不是一个好主意,因为静态方法是相对于一个类的。

c.onCreate();

这种方式不能直接调用类中的方法,因为cClass对象实例,没有这样的方法。 和调用不一样:

DataAdapterTest.onCreate();

您应该传递类的实例而不是Class 对象,并使用实例方法而不是静态方法。在这方面,很难给出建议,因为我们不知道您想要达到什么目标。

设计问题

不用Class参数

你评论了:

我需要 DataSource 能够调用变化的方法 DataAdapter 抽象类

您在此处提供的代码仅使用一个扩展 DataAdapter 的类。如果你需要几个,那么在你的最小例子中至少放 2 个。 截至目前,我认为没有必要在这里传授课程。您还可以执行以下操作:

DataSource myDataSource = new DataSource();
DataAdapterTest.initialize(myDataSource);

public abstract class DataAdapterTest extends DataAdapter {
    public static void initialize(DataSource d) {
        d.addDataAdapter();
    }

    public static void onCreate() {
        //does something here
    }
}

public class DataSource {
    public void addDataAdapter() {
        DataAdapterTest.onCreate();
    }
}

不必要的静态内容

如果DataAdapterTest 类中的所有内容都是静态的,那么扩展DataAdapter 的目的是什么?如果没有子类的实例,就不能使用任何继承的东西。

【讨论】:

  • 我不确定如何实现我正在尝试做的事情。我在上面的代码中添加了两行以帮助阐明该过程。只是想将抽象类的非实例化引用传递给方法以调用传递的抽象类的静态方法。
  • @nuebKitsune 问题是使用静态方法意味着您知道该类。在这个过程中类不能是动态的。为什么需要这样的东西?
  • 我需要 DataSource 能够调用由 DataAdapter 类扩展的不同 DataAdapter 抽象类的方法;我不想要 DataAdapter 类的实例,只是因为我不想在 Android 项目中的活动类之间管理一个或多个该类的实例。我需要 DataSource 类来访问 DataAdapter 类的原因是因为在 DataSource 中调用了一个方法,该方法需要 DataAdapter 抽象类执行操作才能完成。
  • @nuebKitsune 但为什么要以如此通用的方式这样做呢?你实际上有几个不同的类扩展DataAdapter?如果没有,你当然可以使用DataAdapterTest.onCreate();。如果是,那么您将如何使用您的静态代码?
  • 投反对票的人,请注意发表评论,以便在出现问题时改进我的答案。
猜你喜欢
  • 2014-04-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多