有 Java 编程相关的问题?

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

java如何根据泛型类型调用方法?

让我们输入以下代码:

    public abstract class MySuperClass { 
       public abstract void update();
       /* ... */
    }

    public class A extends MySuperClass { 
       @Override
       public void update() { /* ... */ }
       /* ... */
    }

    public class B extends MySuperClass { 
       @Override
       public void update() { /* ... */ }
       /* ... */
    }

    public class Ticket<T extends MySuperClass> {
      private Class<T> c;
      public Ticket(Class<T> c){ this.c = c; }
      public Class<T> getClass() { return this.c; } 
      public void update() { /* HOW TO DO! */ }
      /* ... */
    }

    public class Main {
      public static void main(String[] args) {
        Ticket<A> myTicket1 = new Ticket<A>(A.class);
        Ticket<B> myTicket2 = new Ticket<B>(B.class);
        myTicket1.update();
        myTicket2.update();
      }
    }

如何根据他的类型(AB)等升级票据


共 (3) 个答案

  1. # 1 楼答案

    我已经调整了你的例子,使它更有意义。。。并实现了update

    public class Ticket<T extends MySuperClass> {
        private Class<T> c;
        private T t;
    
        public Ticket(Class<T> c) throws InstantiationException, IllegalAccessException { 
            this.c = c; 
            this.t = c.newInstance();
        }
    
        public Class<T> getClass() { 
            return this.c; 
        } 
    
        public void update() {
            t.update();
        }
        /* ... */
    }
    

    update方法调用t.update(),它将以多态方式分派给t引用的实际对象的update方法。注意,我添加了代码来创建和存储Class<T>的实例

    更新-我已将异常添加到Ticket构造函数中。这是使用反射创建实例所付出的代价的一部分。。。而不是使用new创建它们并将它们作为参数传递

  2. # 2 楼答案

    update()是一个实例方法,因此需要一个实例来调用它。这可以通过以下方式实现:

    getClass().newInstance().update();
    

    由于polymorhism,它将从A或B调用正确的方法。 但要以更面向对象的方式解决这个问题,您应该将一个实例传递给票证构造函数,然后只调用update()

  3. # 3 楼答案

    为什么Ticket知道更新实际上意味着什么。它只需要将调用转发到MySuperClass的实例。泛型类的全部要点是泛型类将处理任何对象(或对象子集),而不必确切知道它是什么类型

    public class Ticket<T extends MySuperClass> {
      private T thing;
      public Ticket(T thing) {
        this.thing = thing;
      }
      public void update() {
        thing.update();
      }
      /* ... */
    }