Java:抽象类中的静态方法调用抽象非静态方法?

标签 java methods static instance

我有一个抽象类A

我有大约 10 个扩展 A 的类

A 类有一个或两个静态方法,它们是静态的是有道理的,因为它们属于 10 个类,而不是它们的实例。一种静态方法,例如称为 getAllFromX,它从 X 获取该类的所有实例,无论它是什么,它可能是一个服务器,它实际上是,但这并不重要。所以你看这些方法是静态的并且没有绑定(bind)到实例是有道理的。

同时A类有一个NON-static抽象方法,每个子类都重写这个方法(只是返回一个字符串)。我无法将其设为静态,因为无法覆盖静态方法 (...)。

总结一下:抽象类A有一个静态方法和一个被子类重写的抽象非静态方法。我不能将第二个方法设为静态,因为它必须被覆盖。另一方面,我可以让第一个方法成为非静态的,但它会非常丑陋和糟糕的编程风格,所以我将保留它。

收获? A 类中的静态方法必须获取非静态方法返回的值(对于子类,当然是继承静态方法)。

使用反射来完成这项工作是“最简单”的方法吗?我是说……真的吗?

例如,我得到静态方法所在的类:

Class<?> cl=new Object(){}.getClass().getEnclosingClass(); (a hack I found here, thank god...)

然后我使用 getConstructor 构造这个子类的对象。

然后我使用这个对象来调用非静态方法。

真的吗??不能做得更简单吗?我的意思是,如果我想在概念上正确地设计我的程序...

来自 C# 我不喜欢那个(以及类型删除的东西)。它只是丑陋的。可行但丑陋。这是一个很大的绊脚石,至少对于初学者来说是这样。编辑:再次阅读后,我会添加:/rant end。抱歉,但我真的很在乎。

最佳答案

我认为您实际上需要的是以下内容:

public class A {
    public static Set<A> getAllFromX() {
        ...
    }
}

public class B extends A {
    public static Set<B> getAllFromX() {
        ...
    }
}


public class C extends A {
    public static Set<C> getAllFromX() {
        ...
    }
}

(就像枚举中的valueOf()values()方法一样,在每个Enum子类中都会重新定义,因为静态方法不能被继承)

在这种情况下,每个类都有自己的静态方法来做任何它想做的事情。但是你的问题没有多大意义,因为它说:

The static method in class A must get the value the non-static method returns (for the subclass the static method is inherited from, of course).

的确,静态方法不会被子类继承。静态方法永远不会被继承。如果在A中定义一个静态方法foo(),并调用

B.foo();

编译器不会拒绝编译它,而是将它翻译成

A.foo();

所以,没有办法在 foo() 中做一些依赖于调用 foo() 的类的事情,因为它总是 A。

关于Java:抽象类中的静态方法调用抽象非静态方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13893864/

相关文章:

Java spring boot webservices 和 html

java - 更改java中不同类的标签文本

应用于对象的 C++ 成员函数

java - 具有类型安全类参数的通用(非静态)方法,它是如何工作的?

java - 谷歌分析平均 session 持续时间为 00 :00:00

java - 如何使用 Selenium 和 Java 提取文本?

Java:如何将动态数量的参数传递给方法

java - Java 中带参数的方法

java - 使用GsonBuilder的静态实例创建Gson实例时发生内存泄漏

c# - 在哪里设置静态成员的属性?