Tôi không hiểu tại sao những điều sau không hiệu quả và tôi chắc chắn câu trả lời có liên quan đến một điều cơ bản mà tôi không hiểu và hy vọng ai đó có thể trợ giúp.Vấn đề với các loại chung của ArrayList và thừa kế giao diện
Tôi hiểu về việc sử dụng giao diện trong một ArrayList
ví dụ rằng nếu tôi có:
public interface Weapon { ... }
public class Gun implements Weapon { ...}
public class Knife implements Weapon { ... }
bạn có thể sau đó chèn bất cứ điều gì mà thực hiện vũ khí vào mảng một vũ khí:
ArrayList<Weapon> weapons = new ArrayList<Weapon>();
weapons.add(new Gun());
weapons.add(new Knife();
Tôi nhận được rằng , nhưng điều gây nhầm lẫn cho tôi là sự hiểu biết tại sao ArrayList<Gun>
không tương thích với ArrayList<Weapon>
theo những cách khác. Để minh họa, sau đây là hợp pháp:
public void interfaceIsTheArgument(Weapon w) { ... }
...
interfaceIsTheArgument(new Gun());
interfaceIsTheArgument(new Knife());
nhưng đây không phải là:
public void interfaceIsTheArgument(ArrayList<Weapon> w) { ... }
...
interfaceIsTheArgument(new ArrayList<Gun>());
interfaceIsTheArgument(new ArrayList<Knife>());
vì các báo cáo chức năng cuộc gọi cuối cùng rằng phương pháp này không áp dụng cho các đối số của nó.
Câu hỏi của tôi là lý do tại sao nếu phương thức biết nó hoạt động ArrayList
với giao diện làm loại chung, tại sao không được chuyển vào danh sách mảng dao trong câu lệnh cuối cùng?
Tôi không biết câu trả lời chính xác, nhưng những gì bạn có thể làm cho ví dụ thứ hai của bạn là sử dụng 'public void interfaceIsTheArgument (ArrayList Extends Weapon>)'. Điều đó sẽ hiệu quả. – fge