当您仅指定使用列表接口时,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;