使用Java / VS代码的两个问题

时间:2019-01-25 22:46:03

标签: java visual-studio-code

下面的代码在两个在线Java编译器上编译,但是我在VS Code上遇到了麻烦。

两个问题:

  1. VS代码导入单个项,例如import java.util.Arrays;,但在使用通配符(例如import java.util.*;

  2. 时不导入)
  3. 在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());
    }
}

1 个答案:

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

所以有两种可能的解释:

  1. 您可能正在执行旧版本的代码;即之前中的一个,您将Entry修改为实现Comparable

  2. Visual Studio可能有问题。


如果我们可以假设问题出在Visual Studio Code,我怀疑它与Java版本有关。 documentation声明支持Java 11,但是可能还需要告诉 VS它正在使用Java 11而不是Java8。(由于Java 9中的模块介绍....)