Java 调用子类';来自父类的静态方法

Java 调用子类';来自父类的静态方法,java,Java,这是一个奇怪的问题,但我想知道是否有一种方法可以“重写”子类中父类的静态方法,并从父类调用该子类的静态方法 它看起来像这样 public class parentFoo { public static void <T extends parentFoo> printFoo () { T.printFoo(); } } public class childFoo extends parentFoo { public static void pr

这是一个奇怪的问题,但我想知道是否有一种方法可以“重写”子类中父类的静态方法,并从父类调用该子类的静态方法

它看起来像这样

public class parentFoo {
    public static void <T extends parentFoo> printFoo () {
        T.printFoo();
    }
}

public class childFoo extends parentFoo {
    public static void printFoo() {
        System.out.println("Foo");
    }
}
公共类parentFoo{
公共静态void printFoo(){
T.printFoo();
}
}
公共类childFoo扩展了parentFoo{
公共静态void printFoo(){
System.out.println(“Foo”);
}
}
因此,您可以在代码中执行类似的操作

 //print out "Foo"
 parentFoo.<childFoo>printFoo();
//打印出“Foo”
parentFoo.printFoo();

这对我来说不起作用,但我想知道是否有什么方法可以做到这一点。现在我得到一个堆栈溢出,因为它只调用父类的printFoo方法。

无法基于泛型类型参数调用静态方法

以下问题的答案提供了一个合理的解决方法

更换

parentFoo.<childFoo>printFoo();
为什么需要重写
静态方法?(这是不可能的)你想完成什么


多态调用仅对对象有意义。因为静态不是对象的一部分,而是类的一部分,所以它不是。

不能重写静态方法。但是,您可以定义同名的静态方法。如果这样做,则可以指定从类类型中调用哪一个

ChildFoo.printFoo(); // call child foo
ParentFoo.printFoo(); // call parent foo

ParentFoo foo1 = new ChildFoo();
foo1.printFoo(); // ParentFoo still called because of type of reference foo1 not its value

ChildFoo foo2 = new ChildFoo();
foo2.printFoo(); // ChildFoo called because of type of reference foo2 not its value

这更多是为了满足我对Java泛型的好奇心。我真的不确定它会被用来做什么,但我想知道这是否可能。我只是想知道,如果你可以用泛型来指示可以使用哪种静态方法。@ ScTutSuMUS,我可以看到C++中的方法,而不是java。但是我想知道是否有某种方法可以使用泛型来使用子类的同名静态方法。我不应该在我的问题中使用“覆盖”这个词,这是一个错误的选择。啊,好的。我想这就是我想问的。谢谢你的链接。@aioobe我能跟你核实一下这些方面的理论吗?实例化和子分类是有区别的。据我所知,静态类不能被实例化——这是公平的。但是静态类可以被子类化吗,尽管对我来说,将静态类子类化没有什么意义。除非我们只能在静态父类中使用少数不受限制的静态方法,并且我们需要将更多新的/特定于应用程序的静态方法添加到单独的静态子类中。简言之,我们能把一个静态类分为子类吗?:-)实例化和子分类之间有区别——对。这是两个不同的概念。实例化是运行时,子类化是编译时。据我所知,静态类不能被实例化——当然可以。但是静态类可以被子类吗?绝对可以。是的,你是对的。但我只是想知道是否有某种方法可以使用泛型来指向子类的静态方法。
ChildFoo.printFoo(); // call child foo
ParentFoo.printFoo(); // call parent foo

ParentFoo foo1 = new ChildFoo();
foo1.printFoo(); // ParentFoo still called because of type of reference foo1 not its value

ChildFoo foo2 = new ChildFoo();
foo2.printFoo(); // ChildFoo called because of type of reference foo2 not its value