30/09/2018, 23:55

Nhờ mọi người giải thích giúp em đoạn code trong java này với ạ!

class GenQueue<E> {
   private LinkedList<E> list = new LinkedList<E>();
   public void enqueue(E item) {
      list.addLast(item);
   }
   public E dequeue() {
      return list.poll();
   }
   public boolean hasItems() {
      return !list.isEmpty();
   }
   public int size() {
      return list.size();
   }
   public void addItems(GenQueue<? extends E> q) {
      while (q.hasItems())
         list.addLast(q.dequeue());
   }
}

public void addItems(GenQueue<? extends E> q) . em ko hiểu dòng này, mong mọi người giải thích giúp em. thanks!

Phan Hoàng viết 02:07 ngày 01/10/2018

Đây là cách viết Generic (cách viết kiểu tổng quát, từ chữ General mà ra). Generic có từ phiên bản 6 nhưng hoàn thiện nhất ở phiên bản 7 (java1.7). Còn dòng mà bạn trích có thể hiểu nôm na như sau:

public void addItems(GenQueue<? extends E> q)

là hàm để thêm 1 Item q có type (kiểu) là là GenQueue (1 Collection). GenQueue này là 1 collection chứa các item là instance của con, cháu, chắt, … hoặc bản thân E (E = Element, chữ E này giúp chúng ta hiểu kiểu thôi, chứ nó là chữ gì cũng được, ví dụ như K là key, V là value, T là Type, …).

Cách viết generic thường được sử dụng khi viết lib dạng tổng quát (giống kiểu template trong C), ví dụ như ArrayList<T>.

  • Khi coder sử dụng typesafe check thì họ viết ArrayList<Student> để compiler check nếu chẳng may nhét Teacher vào ArrayList nó sẽ báo lỗi ngay. Viết kiểu typesafe ngắn hơn kiểu viết truyền thống là if (s instanceof Student) addStudent(s)…
  • Generic cũng giúp coder từ strongtype có thể viết lỏng hơn chút, nghĩa là cho phép bất cứ kiểu T gì. Bạn cho T là Student, Teacher, … hay gì cũng ok, lúc đó ArrayList sẽ typesafe check kiểu được khởi tạo, tránh phải viết ArrayList cho từng type khác nhau. Gỉa sử bạn cần function add cho số nguyên, số thực, số ảo, số phức, số blablablâ … bạn thích viết 1 hàm hay viết nhiều hàm?
Lê Minh Châu viết 01:58 ngày 01/10/2018

nhưng dấu “?” là thế nào ạ?

Reoteu Ray viết 01:56 ngày 01/10/2018

hinh như dấu ? là đai diện cho 1 kiểu dữ liệu tổng quát vì tại thời điểm thực thi thì mới có thể xác định được đó là kiểu gì …

Phan Hoàng viết 02:01 ngày 01/10/2018

Dấu ? là any type that extends E (là con, cháu - subclass, sub sub subclass, … của E).
Ngoài ? extends E ra còn có ? super E.

Ví dụ:
Cat extends Animal
SexyCat extends Cat

Ví dụ mình có một object là GenQueue<Cat>, lúc đó mình có thể gọi hàm addItems(GenQueue<? extends E> q) với q là GenQueue<Cat> cũng được mà GenQueue<SexyCat> cũng ok vì SexyCat là extends của Cat.

Lê Minh Châu viết 02:08 ngày 01/10/2018

em cảm ơn nhiều ạ. hi

Bài liên quan
0