从父类调用子类的静态方法

问题描述:

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

这将是这个样子

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"); 
    } 
} 

,所以你可以做这样的事情在你的代码

//print out "Foo" 
parentFoo.<childFoo>printFoo(); 

这工作不适合我,但我不知道是否有某种方式使这成为可能。现在我得到一个堆栈溢出,因为它只调用父类的printFoo方法。

无法根据泛型类型参数调用静态方法。

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

+0

是的,你是对的。但我想知道是否有某种方式使用泛型来使用具有相同名称的子类的静态方法。我不应该在我的问题中使用“重写”这个词,那是一个不好的选择。 – ScottShamus 2012-03-12 20:56:02

+0

好的。重写答案:-) – aioobe 2012-03-12 20:58:03

+0

啊,好的。我想这就是我实际想要问的。感谢您的链接。 – ScottShamus 2012-03-12 21:01:04

更换

parentFoo.<childFoo>printFoo(); 

childFoo.printFoo(); 

为什么你需要覆盖static的方法呢? (这是不可能的)你想完成什么?

多态调用只对对象有意义。由于静态不是一个对象的一部分,而是一个类的一部分,它不是。

+0

这更符合我对Java泛型的好奇心。我不确定它会用于什么,但我想知道这是否可能。我只是想知道是否可以使用泛型来指示可以使用哪种静态方法。 – ScottShamus 2012-03-12 20:54:51

+0

@ScottShamus我可以看到你如何在C++中做到这一点,但不是为了Java。 – 2012-03-12 20:55:33

您不能覆盖静态方法。但是,您可以定义具有相同名称的静态方法。如果你这样做,那么你可以指定从类中调用哪一个

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 
+0

是的,你是对的。但我只是想知道是否有一些方法可以使用泛型来指向子类的静态方法。 – ScottShamus 2012-03-12 20:59:53