Как вызвать метод в зависимости от его общего типа? - PullRequest
0 голосов
/ 18 ноября 2010

Пусть следующий код:

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

Как обновить билеты в зависимости от его типа (A, B) и т. Д.

Ответы [ 3 ]

4 голосов
/ 18 ноября 2010

Почему Ticket знает, что на самом деле означает обновление.Ему просто нужно переадресовать вызов на экземпляр MySuperClass.Весь смысл универсальных классов состоит в том, что универсальный класс будет работать с любым объектом (или подмножеством объектов), не зная точно, какой это тип.

public class Ticket<T extends MySuperClass> {
  private T thing;
  public Ticket(T thing) {
    this.thing = thing;
  }
  public void update() {
    thing.update();
  }
  /* ... */
}
0 голосов
/ 18 ноября 2010

Я настроил ваш пример, чтобы он стал более понятным ... и реализовал 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(), который полиморфно отправляет методу update фактического объекта, на который ссылается t. Обратите внимание, что я добавил код для создания и хранения экземпляра Class<T>.

ОБНОВЛЕНИЕ - Я добавил исключения в конструктор Ticket. Это часть цены, которую вы платите за использование отражения для создания экземпляров ... вместо того, чтобы создавать их, используя new и передавая их в качестве аргументов.

0 голосов
/ 18 ноября 2010

update () является методом экземпляра, поэтому вам потребуется экземпляр для его вызова.Это может быть достигнуто с помощью

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

Из-за полиморфизма он будет вызывать правильный метод из A или B. Но чтобы решить его более объектно-ориентированным способом, вы должны передать экземпляр в конструктор Ticket ипросто позвоните update ().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...