Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/372.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java:扩展类并实现具有相同方法的接口_Java_Syntax_Specifications - Fatal编程技术网

Java:扩展类并实现具有相同方法的接口

Java:扩展类并实现具有相同方法的接口,java,syntax,specifications,Java,Syntax,Specifications,可能无法执行以下操作(我收到一个编译错误:“继承的方法a.doSomthing(int)无法在B中隐藏公共抽象方法”): 假设我既不允许更改A也不允许更改B,我的问题是,我是否可以以某种方式定义C,使其同时继承A和B(假设某些框架要求C同时是A和B的实例) 如果不是,你会如何解决这个问题 谢谢 公开该方法 public class C extends A implements B { //trying to override doSomthing... public int

可能无法执行以下操作(我收到一个编译错误:“继承的方法a.doSomthing(int)无法在B中隐藏公共抽象方法”):

假设我既不允许更改A也不允许更改B,我的问题是,我是否可以以某种方式定义C,使其同时继承A和B(假设某些框架要求C同时是A和B的实例)

如果不是,你会如何解决这个问题

谢谢

公开该方法

public class C extends A implements B {

    //trying to override doSomthing...

    public int myMethod(int x) {
        return doSomthingElse(x);
    }
}
接口方法总是
public


或者只使用组合而不是继承

这与可见性有关。对于
myMethod
,您正在使用
C
中的
default
(无修改器)可见性,但根据界面
B
,它需要是
public


现在,您可能会认为您对它们都使用了
默认
可见性,因为在
A
B
C
中,您都没有明确选择
公共
私有
受保护
。但是,无论您是否明确表示,接口都使用
public

C
中重写方法时,只需将方法
public
即可。

方法
doSomethis()
在类A中是包私有的

public class A {
    int doSomthing(int x) { // this is package-private
        return x;
    }
}
但它在界面B中是公共的:

public interface B {
    int doSomthing(int x); // this here is public by default
}
编译器将C从包私有的A继承的
doSomething()
作为B中公共包的实现。这就是它抱怨的原因-

“继承的方法A.doSomthing(int)无法在B中隐藏公共抽象方法”

因为,在重写方法时,不能缩小方法的访问级别

在C类中,解决方案很简单-

@Override
public int doSomthing(int x) {
    // ...
}

请报告您的错误。这里没有什么明显的错误,除了如果您使用1.6,可能缺少@Overrides@b参数,没有
public
,而override只是一个可选的麻烦。一个变量既可以是类实例,也可以继承接口吗?在您的示例中,它类似于
newc()实现X
,假设X是interface@Vadorequest实现或扩展是在类级别而不是实例级别完成的。要实现X,您需要将其添加到接口列表中:
public类C扩展了A实现了B,X{…}
@Override
public int doSomthing(int x) {
    // ...
}