【问题标题】:"Cannot subclass the final class" error, but the class is not final [closed]“不能子类化最终类”错误,但该类不是最终类[关闭]
【发布时间】:2019-05-15 17:27:10
【问题描述】:

这是我的代码:

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,除了 ONCE。什么给了?

【问题讨论】:

  • 答案已经给出。下面是如何使用 IDE(例如 Eclipse)找到它的提示。将鼠标放在“字符”字上,它会告诉你它是java.lang.Character 而不是characters.Character

标签: java inheritance package final-class


【解决方案1】:

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

import characters.Character 插入到您的Player 代码中。


参考:using package members

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

【讨论】:

  • 改为重命名自定义 Character 类。
【解决方案2】:

Character 是 java.lang 的一个类(“char”的包装类)。 你必须在你的 Player 类中导入 characters.Character

package player;
import characters.Character

public class Player extends Character {

}

【讨论】:

  • 更好的建议是避免在代码库中将默认库类的名称加倍。像对待关键字“char”一样对待“Character”,因为无论如何这就是它所代表的意思。我会说将“Character”类重命名为“Avatar”、“Entity”、“Person”或不会与现有默认类造成任何混淆的其他名称。
【解决方案3】:

在这种情况下,我强烈建议在the extends clause 中使用Character 类的the fully qualified name

public class Player extends characters.Character {}

经验丰富的 Java 开发人员知道java.lang.Characterfinal,因此无法扩展。写class Player extends Character,你可能会让他们不知所措。

每个编译单元隐式导入在预定义包java.lang 中声明的每个公共类型名称,就好像声明import java.lang.*; 出现在每个编译单元的开头紧跟在任何包声明之后。因此,所有这些类型的名称都可以作为简单名称在每个编译单元中使用。

Java 11 Specification > 7. Packages and Modules > 7.3. Compilation Units

当然,从标准java.lang 包中选择一个不与类冲突的名称会更合理(如PersonGameCharacter)。

【讨论】:

    【解决方案4】:

    Character is an final class 如 Java Docs 中所定义:

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

    所以它不能被子分类。

    您从正在隐式导入的 Character 类中得到错误。 小心!

    【讨论】:

      猜你喜欢
      • 2018-03-24
      • 2017-01-03
      • 1970-01-01
      • 1970-01-01
      • 2016-12-09
      • 1970-01-01
      • 2019-01-31
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多