gpt4 book ai didi

java - 错误 : Type mismatch: cannot convert from List to ArrayList

转载 作者:行者123 更新时间:2023-12-04 07:27:19 26 4
gpt4 key购买 nike

package set01;

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

public class DFTList {
static List<Integer>[] list;
static boolean[] visited;

public DFTList(int nodes) {
list = new ArrayList[nodes];
visited = new boolean[nodes];
for(int i=0;i<nodes;i++) {
list[i] = new ArrayList<>();
}
}

public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
System.out.println("Enter no. of nodes : ");
int nodes = scan.nextInt();
DFTList obj = new DFTList(nodes);
System.out.println("Enter no.of vertex : ");
int vertex = scan.nextInt();


for(int i=0;i<vertex;i++) {
int v1 = scan.nextInt();
int v2 = scan.nextInt();
list[v1].add(v2);
list[v2].add(v1);
}

solve(0);
}

public static void solve(int a) {
visited[a] = true;
ArrayList<Integer> l = list[a];
}

}
在上面的代码片段中,在 DFTList构造函数,我已插入 ArrayList数组的所有索引处的对象。但是当我尝试在 检索相同的对象时solve方法并将其存储在 下相同引用 ,我遇到了一个错误,指出“类型不匹配:无法从 List 转换为 ArrayList”。为什么会出现这个错误?

最佳答案

list变量是 List<Integer>[] ,这意味着任何类型的 List ( ArrayListLinkedList 等)可以存储在其中。从这个列表中检索一个元素时,Java 编译器只知道它是 List 的某种类型。 ;它不知道 List 的具体类型(即使您作为程序员知道您只在数组中存储 ArrayList 项)。因此,ArrayList<Integer> l = list[a]是编译失败,因为编译器不能保证从数组中检索到的元素是 ArrayList而不是不同的List类型。
有几种方法可以解决这个问题。假设您想保留 list作为一个数组,最惯用的方法是将其类型更改为 List<Integer>[]而不是 ArrayList<Integer>[] .由于您没有使用任何特定于 ArrayList 的方法或其他 API。 , List接口(interface)是这种类型的更好选择。

    public static void solve(int a) {
visited[a] = true;
List<Integer> l = list[a];
}
另一种不太惯用的方法是更改​​ list 的类型。来自 List<Integer>[] 的变量至 ArrayList<Integer>[] .此更改将导致您的变量分配按已编写的方式工作。
public class DFTList {
static ArrayList<Integer>[] list;
...
}
当您有一个接口(interface)类型的数组(在本例中为 List<Integer>)时,您可以使用的最后一种方法是在将元素存储到变量时将其转换为具体类型。这基本上是在告诉编译器,您作为开发人员知道该元素属于该子类型,因此即使它不能保证分配,它也会允许它发生。这种方法推迟了类型检查——确保 ListArrayList子类型——直到代码实际运行(在运行时)。如果存储的元素是 ArrayList 以外的子类型当代码运行时(例如,如果它是 LinkedList ),那么 Java 将抛出 ClassCastException自从分配给 ArrayList不可能发生。
像这样的强制转换并不理想,因为它消除了编译器对所有正在使用的类型都保证在运行时有效的保证。但是,有时它是必要和适当的。
    public static void solve(int a) {
visited[a] = true;
ArrayList<Integer> l = (ArrayList<Integer>) list[a];
}

关于java - 错误 : Type mismatch: cannot convert from List<Integer> to ArrayList<Integer>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68143968/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com