当我以这种格式List obj = new LinkedList()
创建对象时,为什么我无法访问LinkedList
方法?
答案 0 :(得分:2)
使用
List obj = new LinkedList()
你拥有的是List
。你已经"存储"其中的LinkedList
但您将其视为List
。
另一方面,有: -
LinkedList obj = new LinkedList()
您可以将其视为LinkedList
答案 1 :(得分:1)
答案 2 :(得分:0)
原因编译器不知道你使用的是什么类型的列表,所以使用运行时类型识别你只能使用接口方法,这里,List是接口
答案 3 :(得分:0)
您的代码会创建一个List(接口)类型的变量。
当其他代码引用obj变量时,它只能假设使用obj变量引用的任何对象都实现了List接口。
要断言obj引用的对象是一个链接列表,你需要将obj强制转换为LinkedList,并假设接口实现者是一个链接列表。
虽然使用接口等抽象编程通常很好,但如果需要访问raw类型提供的方法,则表明您应该使用对原始类型的引用(在本例中为LinkedList)或使用接口除了提供所需方法的List之外。
LinkedList<String> myLinkedList = new LinkedList<>();
public void expectsList(List<String> maybeLinkedList){
maybeLinkedList.listInterfaceMethod(); // works ok
LinkedList linkedList = (LinkedList<String>) maybeLinkedList; // CAST may fail if obj is not a linked list
linkedList.linkedListMethod(); // If cast worked, this works
}
public void expectsLinkedList(LinkedList<String> aLinkedList){
aList.listInterfaceMethod(); // Works because linked list honors the List interface
List<String> list = aLinkedList; // also works because Linked list 'is a' kind of List
list.listInterfaceMethod(); // works ok
linkedList.linkedListMethod(); // We know the input object is a linked list
}
请注意,该转换仅用于说明更改类型 - 在这种情况下,您无需强制转换以解决问题。