有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java泛型如何在知道子类类型和超类的情况下调用子重载方法

我有一系列扩展基类的类。基类有一个方法,我们应该说:

doStuff1(int variable){ do something;}

这些课程中的每一个都有一个:

doStuff1(String string) {convert string to number and call super.doStuff1(intResult)};

在另一个类中,我有如下方法:

public void bla(Class<?> childClass, SuperClass childClassInDisguise) {
    (childClass.cast(childClassInDisguise)).doStuff1(myString);
}

我无法编译此文件,因为: 方法doStuff1(myString)对于类型捕获#17未定义

我做错了什么? 这可能吗

谢谢


共 (1) 个答案

  1. # 1 楼答案

    编译器不知道它代表哪个类

    Class<?>
    

    它知道的关于这个对象的唯一线索是,它有一个只包含doStuff1(int)的超类

    如果您真的想调用doStuff1(String),为什么不创建另一个包含此方法并将此方法标记为abstract的抽象子类呢。现有的子类应该扩展这个新的子类

    public abstract class NewSubclass extends Superclass {
      public void abstract doStuff1(String);
    }
    

    然后在方法中添加一个通用参数,例如

        public <T extends NewSubclass>void bla(Class<T> childClass, SuperClass childClassInDisguise) {
            (childClass.cast(childClassInDisguise)).doStuff1(myString); 
        }
    

    通过这种方式,编译器知道对象的继承继承权,对象是包含该抽象方法的NewSubclass的子类

    编辑

    如果你只能编辑bla方法,试试这个

    public void bla(Class<?> childClass, SuperClass childClassInDisguise) {
          if(childClass.equals(ChildClass1.class) {
            (ChildClass1(childClassInDisguise)).doStuff1(myString);
         } else ... {
         } 
    }
    

    在其他已知的子类中执行相同的if条件。我知道它是硬编码的,但如果不能通过修改涉及的类来使用泛型+抽象超类,这是唯一的方法。但我还是更喜欢我的第一个建议,因为它的代码和动态更少,比如当你添加另一个子类时,你不必再次改变bla方法(多态性的力量),不像第二个建议。这更像是一个设计重建问题