Mình thì không biết về Java và cũng tham gia xem, liệu chủ topic có thông không chứ có vẻ topic này dạng đang kiểu như A: “tại sao con ngỗng kêu to?”. B: vì con ngỗng có cổ dài? A: con ễnh ương có cổ dài không mà vẫn kêu to? B: à, vì nó có bình hơi ở cổ. Blah blah kiểu này thì tất cả chúng ta cần phải học lại môn “Nhập môn logic học” để tránh vi phạm nguyên tắc suy luận, cụ thể là tam đoạn luận. Có bạn Đức Mạnh gì đó đang giải thích 1, Nobita không chịu nghe, đi thay đổi để thành 3 rồi bật lại 1, thành ra ông nói gà bàn nói vịt, vi phạm nguyên tắc về logic học.
Thử xét từng cái xem:
1.
CardboardContainer<String> n1 = new CardboardContainer<String>("Hello"); // In T constructor
Đoạn trên không có gì phải giải thích, quá dễ hiểu, vì String từ đầu tới cuối.
-
CardboardContainer<String> n2 = new CardboardContainer<String>(3); // In T2 constructor
Đoạn trên vì sao ra “In T2 constructor” theo mình hiểu như này: n2 ta khai báo là String, xong truyền vào một Integer. Vậy thì nó xử lý sao? Nó sẽ tìm xem bên trong có cái nào là String không để rẽ qua đó. Không có cái nào String cả. Vậy giờ sao? Vậy thì “nó” (nào đó mình không rõ, chủ topic dùng nó thì mình cũng dùng nó, trong khi lẽ ra là him/ hoặc I) xem thằng nào gần gần nhất với Integer là 3 (mình không rõ Java gị là Number hay Integer hay có cả 2 nên dùng là “số nguyên” đi nhé), 3 (là số nguyên, phân biệt với “3”). Nó xét thấy "à, thằng 3 này dường như là số, có cái nào là số không thì ưu tiên. Ô là la, T extends Number là gần nhất, quăng cho nó cái bomb.
-
CardboardContainer<Integer> n22 = new CardboardContainer<Integer>(3); // In T constructor
Thằng này thì sao? Khai báo n22 là Integer, truyền vào cho nó là 3, số và số nốt, chẳng có cái gì phải lăn tăn cả, duyệt từ trên xuống, thằng nào có tham số là số thì dùng. Khỉ thật, nó đứng ngay đầu hàng, chuyển quả cho nó đi dù nó đang là “thằng cô dâu” chứ không phải đám gái xinh bưng quả. Vậy là In T constructor (nhà gái nhận quả nào).
-
CardboardContainer<String> n3 = new <Integer>CardboardContainer<String>(3);
Của quý gì đây? Khai báo một thằng n3 là String. Param của nó cũng Sờ tring luôn, nhưng điên rồ thật, sao lại có trò ép kiểu Integer và truyền vào nó là một số thật, nhưng lại có tham số lại là String, truyền vào đối số là 3. Rối rắm, điên rồ. Xem cái ký tự/ chuỗi ký tự kia có phải là ký tự chữ số hay không? Nếu phải thì ép kiểu cho nó thành Integer, và kiếm thằng Constructor nào liên quan đến số thì quăng cho nó. Úi chà, tìm thấy có thằng T extends Number, quăng cho nó đi. Nếu không ép được kiểu thì nghỉ chơi, báo lỗi (cái này mình tự nghĩ ra, không biết thực tế thế nào nếu thay vì 3 mà thành n thì ra sao).
Sau khi mình đọc tới đọc lui thì có vẻ ông Nobita1 hổng kiến thức, ổng chưa rành phía sau cú pháp thực sự là cái gì, ảnh hưởng/ chịu ảnh hưởng của gì khác. Có lẽ cần tìm hiểu lại Java các phiên bản cũ hơn hoặc tìm trong OOP xem bản chất đang là cái g? Quen hay lạ? Có hiểu nó chưa? Có cái tên nghe có vẻ rối rắm, cú pháp lạ nhưng bản chất của nó chính là cái “xưa như quả đất”, đã biết từ trước trong “trang X, chương Y của sách Flip flop OOP”.
Ví dụ như mình dùng chữ “ép kiểu” ở trên có thể nghe tào lao, và tự suy luận, nhưng theo mình bản chất có lẽ là vậy. Và rõ ràng là 1 coder không nên sa đà vào những cái rối rắm quá sớm, nên viết mã theo cách dễ hiểu với bản thân. Đến một lúc nào đó khi lập trình đủ nhiều, hoặc đọc được code người khác phát hiện ra hay ho, kỹ năng sẽ tăng lên, rồi vọc mấy cái rối rắm sau. Ví dụ luôn, JavaScript hiện đại cứ toàn mấy cái hàm => nhưng mình chưa thông nên chưa dùng, rồi forEach nữa, mình cứ lặp truyền thống. Chừng nào các xưa không được nữa thì tính.