为什么我无法使用List引用类型对象访问LinkedList方法

时间:2017-09-08 12:19:46

标签: java list collections

当我以这种格式List obj = new LinkedList()创建对象时,为什么我无法访问LinkedList方法?

4 个答案:

答案 0 :(得分:2)

使用

List obj = new LinkedList()

你拥有的是List。你已经"存储"其中的LinkedList但您将其视为List

另一方面,有: -

LinkedList obj = new LinkedList()

您可以将其视为LinkedList

答案 1 :(得分:1)

如果你在谈论java.util.List它是一个接口,而LinkedList是一个实现List的类。

LikedList
List

这就是为什么你只能使用接口方法。

答案 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

}

请注意,该转换仅用于说明更改类型 - 在这种情况下,您无需强制转换以解决问题。