web-dev-qa-db-fra.com

Erreur "Impossible de sous-classer la classe finale", mais la classe n'est pas finale

Voici mon code:

package basic;

public abstract class Entity {}

package characters;

import basic.Entity;

public abstract class Character extends Entity {}

package player;

public class Player extends Character {}

Je reçois le

Le type Player ne peut pas sous-classer le final class Character.

mais j’ai vérifié un million de fois et je n’ai pas encore utilisé final tout sauf UNE dans mon projet. Ce qui donne?

38
Fletcher

Vous prolongez Java.lang.Character _ (qui n'a pas besoin d'importation, car il provient de Java.lang).

Insérer import characters.Character dans votre code Player.


Référence: en utilisant les membres du paquet :

Pour plus de commodité, le compilateur Java importe automatiquement deux packages complets pour chaque fichier source: (1) le package Java.lang et (2) le package actuel (le package correspondant au fichier actuel).

94
Adam Kotwasinski

Character est une classe de Java.lang (la classe wrapper de "char"). vous devez importer des caractères.Caractère dans votre classe de joueur

package player;
import characters.Character

public class Player extends Character {

}
17
Chris

Dans ce cas, je recommande fortement d'utiliser le nom complet de la classe Character dans la clause extends .

public class Player extends characters.Character {}

Expérimenté Java savent que Java.lang.Character est final et ne peut donc pas être étendu. En écrivant class Player extends Character, vous les feriez probablement.

Chaque unité de compilation importe implicitement chaque nom de type public déclaré dans le package prédéfini Java.lang, comme si la déclaration import Java.lang.*; est apparu au début de chaque unité de compilation immédiatement après toute déclaration de paquet. En conséquence, les noms de tous ces types sont disponibles en tant que noms simples dans chaque unité de compilation.

Spécification Java 11> 7. Packages et modules> 7.3. Unités de compilation

Bien sûr, il serait plus raisonnable de choisir un nom qui n'entre pas en conflit avec les classes de la norme Java.lang package (comme Person ou GameCharacter).

9
Andrew Tobilko

Le caractère est une classe finale comme défini dans Java Docs:

public final class Character
extends Object
implements Serializable, Comparable<Character>

il ne peut donc pas être sous-classé.

Vous obtenez une erreur de cette classe de caractères, qui est implicitement importé. Attention!.

7
Jabongg