无法创建继承自final类的子类错误,但该类并非final。

38

这是我的代码:

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。为什么会这样呢?


12
答案已经给出了。这里有一个提示,如何使用您的IDE(例如Eclipse)找到它。将鼠标放在“Character”单词上,它会显示它是java.lang.Character而不是characters.Character - Ralf Kleberhoff
4个回答

93

您正在扩展java.lang.Character (不需要导入,因为它来自java.lang)。

请在您的Player代码中插入import characters.Character


参考:使用包成员

为了方便起见,Java编译器会自动导入每个源文件的两个完整包:(1)java.lang包和(2)当前包(当前文件的包)。


19
请将自定义的"Character"类更名。 - chrylis -cautiouslyoptimistic-

17

Character 是 java.lang 的一个类(char 的包装类)。 你需要在 Player 类中导入 characters.Character。


你需要在 Player 类中导入 characters.Character。

package player;
import characters.Character

public class Player extends Character {

}

12
一个更好的建议是完全避免在你的代码库中将默认库类的名称重复。把 "Character" 类型视为关键词 "char",因为它本来就是同样的东西。我建议将 "Character" 类改名为 "Avatar"、"Entity"、"Person" 或其他一些不会与现有默认类产生混淆的名称。 - Darrel Hoffman

9
在这种情况下,我强烈建议在extends子句中使用Character类的完全限定名称
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)会更合理。

7

Character是Java Docs中定义的一个final类

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

因此它无法被子类化。

你从这个字符类中得到错误提示,这是由于该类被隐式导入。请注意!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接