下面的代码在两个在线Java编译器上编译,但是我在VS Code上遇到了麻烦。
两个问题:
VS代码导入单个项,例如import java.util.Arrays;
,但在使用通配符(例如import java.util.*;
在VS Code中执行(编辑)下面的代码时,发生以下异常:
线程“ main”中的异常java.lang.ClassCastException:无法将条目强制转换为java.base / java.lang.Comparable 在java.base / java.util.ComparableTimSort.countRunAndMakeAscending(未知来源) 在java.base / java.util.ComparableTimSort.sort(未知来源) 在java.base / java.util.Arrays.sort(未知来源) 在EntryTester.main(EntryTester.java:33)
我不知道为什么演员表有问题。这是代码:
import java.util.Arrays;
class Entry implements Comparable<Entry> {
private String word;
private String definition;
public Entry(String wor, String def) {
this.word = wor;
this.definition = def;
}
public String getWord() {
return word;
}
public String getDefinition() {
return definition;
}
public String toString() {
return word + "\t" + definition;
}
public int compareTo(Entry other) {
return word.compareTo(other.getWord());
}
}
class EntryTester {
public static void main (String[] args) {
Entry[] wordList = new Entry[5];
wordList[0] = new Entry("WWW", "World Wide Web");
wordList[1] = new Entry("HTTP","Hypertext Transport Protocol");
wordList[2] = new Entry("DNS", "Domain Name System");
wordList[3] = new Entry("AWT", "Application Windowing Toolkit");
wordList[4] = new Entry("CPU", "Central Processing Unit");
Arrays.sort(wordList);
for (int j = 0; j < wordList.length; j++)
System.out.println(wordList[j].toString());
}
}
答案 0 :(得分:1)
VS代码导入单个项,例如
时不导入)import java.util.Arrays;
,但是在使用通配符(例如import java.util.*;
不清楚您的意思。但是我怀疑您误解了Java中通配符导入的含义:
java.util
包中。java.util.concurrent
等子包中的类。 另一方面,如果您期望import java.util.*;
导入Arrays::sort
静态方法的名称,则不会。 import java.util.Arrays;
也没有!如果要导入状态方法,则需要执行以下操作:
import static java.util.Arrays.*;
如果Visual Studio Java 编译器告诉您一些不同,则非常错误。
(注释:大多数程序员倾向于避免在生产代码中导入通配符。如果在多个程序包中声明了名称,则可能会遇到问题。)
在VS Code中执行(编辑)下面的代码时,发生以下异常:
Exception in thread "main" java.lang.ClassCastException: Entry cannot be cast to java.base/java.lang.Comparable
使用Arrays.sort
对列表进行排序时,sort
方法可以通过两种方式对Entry[]
的元素进行排序
Comparator<Entry>
方法提供一个sort
参数。Entry
类可以implement
Comparable<Entry>
接口。如果您不提供Comparator
,则sort
方法假定,您正在以其他方式这样做。因此,它现在尝试将Entry
对象之一转换为Comparable
,以便它可以在其上调用entry.compareTo(anotherEntry)
。哪个失败...
对于您而言,您似乎已经在Comparator
中实现了Entry
。
所以有两种可能的解释:
您可能正在执行旧版本的代码;即之前中的一个,您将Entry
修改为实现Comparable
。
Visual Studio可能有问题。
如果我们可以假设问题出在Visual Studio Code,我怀疑它与Java版本有关。 documentation声明支持Java 11,但是可能还需要告诉 VS它正在使用Java 11而不是Java8。(由于Java 9中的模块介绍....)