簡體   English   中英

如何根據類型的泛型調用方法?

[英]How to call a method depending on its type generic?

讓下面的代碼:

    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 )等升級票證?

Ticket為何不知道更新的實際含義。 它只需要將調用轉發到MySuperClass的實例。 泛型類的全部要點是,泛型類可以與任何對象(或對象的子集)一起使用,而不必確切知道它是什么類型。

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

update()是一個實例方法,因此您將需要一個實例來調用它。 這可以通過以下方式實現

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

由於多態性,它將從A或B調用正確的方法。但是要以一種更加面向對象的方式解決該問題,您應該將一個實例傳遞給Ticket構造函數,而只需調用update()。

我已經對您的示例進行了調整,以使其更有意義...並實現了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來創建實例並將其作為參數傳遞。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM