当前位置: 首页 > 知识库问答 >
问题:

为什么Java接口不能用不太具体的函数实现

叶衡虑
2023-03-14

为什么我不能在Java中做到这一点:

interface Context{
    void add(Integer o);
}
class Subclass implements Context{
    @Override
    public void add(Object o){...}
}

不会是子类。add已经实现Context。add,因为它add(Object)可以执行add(Integer)可以执行的所有操作?

解决这个问题的好方法是什么?

现在我正在做一种丑陋的方式:

private void actuallyAdd(Object o){...}
public void add(Object o){actuallyAdd(o);}
public void add(Integer o){actuallyAdd(o);}

编辑:这不是上述问题的副本。在给定的问题中,超类是以更一般的“Object”作为参数的类,而子类则更具体。这不起作用,因为更具体的方法可能无法处理任何对象。在我的问题中,子类不如超类具体,这意味着子类总是能够处理超类所需的任何内容。

共有2个答案

阎兴为
2023-03-14

你可以试试泛型:

interface Context<T> {
    void add(T t);
}

class Subclass implements Context<Object> {
    @Override
    public void add(Object o){...}
}
施景同
2023-03-14

这是因为Java编译器要求重写方法的签名是重写方法的“子签名”。也就是说,要么参数的类型相同,要么参数类型的擦除相同。

8.4.8.1 JLS分部对此声明如下:

在类C中声明或由类C继承的实例方法mC,从C重写在接口I中声明的另一个方法mI

    < Li > m < sub > C 的签名是m I的签名的子签名(8.4.2)。

第8.4.2节:

方法 m1 的签名是方法 m2 签名的子签名,如果出现以下任一情况:

> M

  • 2 与 M1 具有相同的签名,或

    m1的签名与m2的签名的擦除(§4.6)相同。

    您可以通过声明一个泛型类型参数来解决这个问题,正如另一个答案所指出的那样,尽管不清楚接口的原始目的是采用Integer还是只是一些特定但未知的类型。

  •  类似资料:
    • 问题内容: 在开始阅读之前:这个问题不是关于理解monad的问题,而是关于确定Java类型系统的局限性的,这会限制接口的声明。 在我的努力去理解单子我读这个由埃里克利珀SO- 答案上询问单子简单的解释问题。在那里,他还列出了可以在monad上执行的操作: 有一种方法可以将未放大类型的值转换为放大类型的值。 有一种方法可以将未放大类型的操作转换为遵循前面提到的功能组成规则的放大类型的操作 通常,有一

    • 问题内容: 我的意思是: 我用谷歌搜索,发现了这个: 表示定义接口方法的实现。但是接口没有实现,因此是不可能的。 但是,interface是100%抽象的类,抽象类可以实现接口(100%抽象的类)而无需实现其方法。将其定义为“接口”时会出现什么问题? 详细来说, 问题答案: 表示实现,当旨在声明仅提供不提供实现时。 A 100%,是功能上等同于,但它也可以实现,如果你想(在这种情况下,它不会保持1

    • 问题内容: 在Java中,为什么不能在接口中使用受保护的方法? 由于根据Java规范 受保护的访问(由关键字protected表示)-同一包中任何类型以及任何包中的子类均可访问的字段或方法。 如果我必须使用该接口,那么我将实现它并覆盖方法。因此,如果我要实现类可以访问这些方法的位置,因为该方法可以在任何包中访问。那么,将方法声明为Interface中的保护有什么害处? 问题答案: 受保护的方法旨在

    • 我想问一下你为什么在这种情况下使用会产生错误“”?为什么我不能使用类的实例实现一个接口作为参数,并返回由同一接口定义的方法的类型?

    • 使用scandir()函数时,我收到以下php警告: Scandir无法打开目录:公共html/page2中不允许操作。php在线3 第2页。php 我想使用这个功能来打印我的根文件夹的文件和子目录,但它不工作。 有人知道怎么修吗?

    • 我习惯像这样声明数组内联: 为什么我不能对函数执行相同的操作?假设我有一个类,其中包含and 方法,这是有效的: 但是,这不是: 它不喜欢内联数组声明,编译器错误是“不能创建函数的泛型数组” 编辑 我认为我的问题不是建议的副本,因为我想使用数组初始值设定项语法静态定义一组函数