web-dev-qa-db-ja.com

「最終クラスをサブクラス化できません」エラーが発生しましたが、クラスは最終クラスではありません

ここに私のコードがあります:

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をプロジェクトで一度しか使用していません。何が得られますか?

38
Fletcher

Java.lang.Characterを拡張しています(Java.langからのインポートなので、インポートは不要です)。

import characters.CharacterPlayerコードに挿入します。


参照: パッケージメンバーを使用

便宜上、Javaコンパイラは、ソースファイルごとに2つのパッケージ全体を自動的にインポートします。(1)Java.langパッケージと(2)現在のパッケージ(現在のファイルのパッケージ)。

94

文字はJava.langのクラス(「char」のラッパークラス)です。プレイヤークラスのキャラクターをインポートする必要があります

package player;
import characters.Character

public class Player extends Character {

}
17
Chris

この場合、 Characterextendsクラスの 完全修飾名 を使用することを強くお勧めします。

public class Player extends characters.Character {}

経験豊富なJava開発者は Java.lang.Characterfinal であり、それによって拡張できないことを知っています。 class Player extends Characterを書くことで、おそらくそれらをプラスにしないでしょう。

すべてのコンパイル単位暗黙的にインポート定義済みパッケージJava.langで宣言されたすべてのパブリック型名。宣言import Java.lang.*;がパッケージ宣言の直後に各コンパイル単位の先頭に出現したかのように。その結果、これらすべてのタイプの名前は、すべてのコンパイル単位で単純名として使用できます。

Java 11仕様> 7.パッケージとモジュール> 7.3。コンパイル単位

もちろん、標準のJava.langパッケージのクラスと衝突しない名前(PersonGameCharacterなど)を選択する方が合理的です。

9
Andrew Tobilko

文字は最終クラスです Java Docsで定義されているとおり:

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

そのため、サブクラス化することはできません。

暗黙的にインポートされているこのCharacterクラスからエラーが発生しています。 注意してください!

7
Jabongg