Mã sau sử dụng khái niệm ghi đè phương pháp trong Java.Loại trả về biến đổi trong Java
package pkg;
import java.util.ArrayList;
import java.util.List;
abstract class SuperClass
{
abstract public List<String>getList();
}
final class SubClass extends SuperClass
{
private List<String>list=null;
@Override
public ArrayList<String> getList()
{
list=new ArrayList<String>();
list.add("A");
list.add("B");
return (ArrayList<String>) list;
}
}
final public class Main
{
public static void main(String[] args)
{
SuperClass s=new SubClass();
List<String>list=s.getList();
for(String str:list)
{
System.out.println(str);
}
}
}
Theo quy ước, ghi đè phương thức sử dụng cùng chữ ký (với kiểu trả về) trong cả hai lớp siêu và lớp con. Trong đoạn mã trên, kiểu trả về của phương thức getList()
trong SuperClass
là List
và trong phân lớp của nó kiểu trả về là ArrayList
. Phương pháp ghi đè tác phẩm ở đây như thế nào?
Nhân tiện, rõ ràng là ArrayList
là triển khai giao diện List
nhưng trình biên dịch xử lý kiểu trả về ở đây khi ghi đè phương pháp getList()
như thế nào?
Tôi có nên tin điều gì đó như thế này không? Loại trả về của phương thức ghi đè được phép là loại phụ của loại trả về của phương thức được ghi đè.
Có vẻ như không có lý do chính đáng để tuyên bố 'SubClass.list' như một' List' (chứ không phải là một 'ArrayList'). –
@ MichaelBrewer-Davis - Nó có thể làm cho mọi thứ đẹp hơn khi bạn đang sử dụng 'SubClass' trực tiếp thay vì xử lý nó như một' SuperClass'. –
@Brendan - Tôi đã nói về biến thành viên (tư nhân) quá chung chung, không phải là phương pháp quá cụ thể. Hiệp phương sai trong phương pháp là ánh nắng mặt trời và bướm. –