Две проблемы с использованием Java/VS Code

Приведенный ниже код компилируется двумя онлайн-компиляторами Java, но у меня возникают проблемы с VS Code.

Две проблемы:

  1. VS Code импортирует отдельные элементы, такие как import java.util.Arrays;, но не импортирует при использовании подстановочного знака, такого как import java.util.*;.

  2. При выполнении (редактировании) приведенного ниже кода в VS Code возникает следующее исключение:

    Exception in thread "main" java.lang.ClassCastException: Entry cannot be cast to java.base/java.lang.Comparable at java.base/java.util.ComparableTimSort.countRunAndMakeAscending(Unknown Source) at java.base/java.util.ComparableTimSort.sort(Unknown Source) at java.base/java.util.Arrays.sort(Unknown Source) at 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());
    }
}

Мне кажется, что я что-то здесь упускаю... Там 37 строк, в трассировке исключений указано, что это строка 38?

Ed Grimm 25.01.2019 23:52

Представленное вами исключение не возникает при компиляции. Это происходит, когда вы выполняете полученную программу.

John Bollinger 25.01.2019 23:58

... и это не возникает из представленного кода, по крайней мере, не для меня.

John Bollinger 26.01.2019 00:03

Я отредактировал. Да, я имел в виду исполнение. И да, с кодом проблем нет — поэтому я и говорю в начале: «Приведенный ниже код компилируется двумя онлайн-компиляторами Java». Пожалуйста, попробуйте сделать полезные предложения относительно того, почему у меня должны быть проблемы именно с VS Code, как указано в заголовке вопроса.

sid 26.01.2019 02:14

Какая строка 38?

tryman 26.01.2019 02:20

Хорошо... это строка 33. Я отредактировал код, когда публиковал его. Извинения. Отредактировали.

sid 26.01.2019 03:01
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
6
463
1

Ответы 1

VS Code imports single items such as import java.util.Arrays; but does not import when using a wildcard like 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 компилятор говорит вам что-то другое, что-то очень не так.

(Комментарий: большинство программистов склонны избегать импорта подстановочных знаков в производственном коде. У вас могут возникнуть проблемы, если имена объявлены в нескольких пакетах.)


When executing(edit) the code below in VS Code, the following exception occurs:

  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, я подозреваю, что она связана с версиями Java. В документация указано, что Java 11 поддерживается, но для рассказать VS также может быть необходимо, чтобы он использовал Java 11, а не Java 8. (Есть некоторые существенные различия во времени выполнения из-за введения модулей в Java 9....)

Не могли бы вы сказать, почему это не удается? Кроме того, почему он должен выполняться в другом месте, но не в VS Code?

sid 26.01.2019 03:05

Краткий ответ: ваш VS Code, возможно, сломан или неправильно установлен/неверно настроен. Я бы предпочел использовать NetBeans, Intellij или Eclipse. Или даже набор инструментов JDK.

Stephen C 26.01.2019 03:08

Другие вопросы по теме