Ошибка "Не удается создать подкласс окончательного класса", но класс не является окончательным
Вот мой код:
package basic;
public abstract class Entity {}
package characters;
import basic.Entity;
public abstract class Character extends Entity {}
package player;
public class Player extends Character {}
Я получаю
Тип Player
не может наследовать final class Character
.
но я проверил миллион раз, и мне еще предстоит использовать в своем проекте final
all, но ONCE. Что дает?
Ответы
Ответ 1
Вы расширяете java.lang.Character
(который не нуждается в импорте, как это происходит из java.lang
).
Вставьте import characters.Character
в ваш код Player
.
Справка: использование членов пакета:
Для удобства компилятор Java автоматически импортирует два целых пакета для каждого исходного файла: (1) пакет java.lang и (2) текущий пакет (пакет для текущего файла).
Ответ 2
Character - это класс java.lang (класс-обертка char). Вы должны импортировать символы. Характер в вашем классе игрока
package player;
import characters.Character
public class Player extends Character {
}
Ответ 3
В этом случае я настоятельно рекомендую использовать полное имя класса Character
в предложении extends
.
public class Player extends characters.Character {}
Опытные Java-разработчики знают, что java.lang.Character
является final
и поэтому не может быть расширен. Написав class Player extends Character
, вы, вероятно, сделаете их в замешательстве.
Каждый модуль компиляции неявно импортирует каждое публичное имя типа, объявленное в предопределенном пакете java.lang
, как если бы объявление import java.lang.*;
появляется в начале каждого блока компиляции сразу после любого объявления пакета. В результате имена всех этих типов доступны как простые имена в каждой единице компиляции.
Спецификация Java 11> 7. Пакеты и модули> 7.3.Единицы Компиляции
Конечно, было бы разумнее выбрать имя, которое не конфликтует с классами, из стандартного пакета java.lang
(например, Person
или GameCharacter
).
Ответ 4
Character - это последний класс, определенный в Java Docs:
public final class Character
extends Object
implements Serializable, Comparable<Character>
так что это не может быть подклассом.
Вы получаете ошибку от этого класса Character, который неявно импортируется. Осторожно! ,