当您仅指定使用列表接口时,java是否使用ArrayList或LinkedList?

当您仅指定使用列表接口时,java是否使用ArrayList或LinkedList?,java,arraylist,linked-list,Java,Arraylist,Linked List,我刚刚意识到我有一些运行的代码,并且所有的测试都通过了,尽管我从未指定要使用列表接口的具体实现 这就是所讨论的功能 public List<Product> getProductList(int CategoryId) { List<Product> returnedProducts = null; HttpGet httpGet = new HttpGet("https://www.shirts.io/api/v1/products/category/"

我刚刚意识到我有一些运行的代码,并且所有的测试都通过了,尽管我从未指定要使用列表接口的具体实现

这就是所讨论的功能

public List<Product> getProductList(int CategoryId)
{
    List<Product> returnedProducts = null;
    HttpGet httpGet = new HttpGet("https://www.shirts.io/api/v1/products/category/"+CategoryId+"/?api_key="+this.apiKey);
    try
    {
        response = httpClient.execute(httpGet);
        if(response.getStatusLine().getStatusCode() == 200)
        {
            entity = response.getEntity();
            jsonResponse = EntityUtils.toString(entity);

            Type listType = new TypeToken<List<Product>>(){}.getType();
            JsonNode root = mapper.readTree(jsonResponse);
            ArrayNode products = (ArrayNode) root.path("result");
            returnedProducts = (List<Product>) gson.fromJson(products.toString(), listType);
        }

    }
    catch (IOException e)
    {
        e.printStackTrace();
    }

    return returnedProducts;
}
这是对上述功能的测试

public void testGetProductCategories()
{
    List<Category> categories = null;
    categories = productCalls.getProductCategories();
    assertEquals(20,categories.size());
}

一切正常,没有给我任何编译错误。为什么会发生这种情况?我认为您必须指定是使用ArrayList还是LinkedList。为什么我的代码运行时不必指定一个或另一个?

当您返回gson.fromJsonproducts.toString、listType;的结果时;,创建具体列表对象的责任在于gson。

,因为fromJson使用列表的哪个实现并不重要。您正在调用一个返回列表的方法—它正在创建某种类型的列表,但它是哪种实现并不重要。如果是,那么它将返回ArrayList或其他特定实现

因为它返回列表,所以有人可以更改由fromJson返回的列表的实现,而您的代码也不必更改,因为它仍然是一个列表,这就是所需的一切。

在Java中,列表是一个接口。具体的实现ArrayList或LinkedList或其他一些列表将由gson选择,对于调用方来说应该不重要。如果你很好奇,你可以这样称呼getClass-

if (categories != null) {
  System.out.println(categories.getClass().getName());
}
首先,由于ArrayList和LinkedList都实现了List,所以它们都是List实例

无论在何处看到对列表的引用,都可以引用ArrayList或LinkedList,或任何其他实现。它被称为一种关系

它就像你的汽车,如果交通法谈论你的汽车,它指的是它的品牌,因为铃木或大众都执行汽车合同


通常,最好使用提供所需功能的更通用的接口/超类。这样,您就可以只更改对象的实例化类,而其他类也可以更改为相同的is关系,并且您的其余代码将不需要更改。

在阅读了一些响应后,我发现gson只返回一个列表,它以某种方式决定使用哪一个。但现在我有了一个通用的列表接口,难道我不需要在所有代码中都使用列表吗?如果我想使用特定的实现,我不能说ArrayList myList=object.getProductList。是的,您必须使用List,但这没有问题。您真的关心列表的哪种实现吗?如果您有兴趣,可以使用returnedProducts.getClass.getName获取运行时类型,但该列表似乎提供了您需要的所有功能。如果您想这样做,也可以使用new arraylistereturnedProducts将返回的任何列表转换为ArrayList。但同样,这是没有必要的。我知道它们都实现了列表接口。但我认为你不能实例化接口,而是必须实例化实现该接口的类的对象。你不能从接口实例化对象,只能从非抽象类实例化对象,这是正确的。最后,将有一个新的类名。但是您对实例的引用可以由类型为接口的变量处理:List myList=new ArrayList;