第一种情况
interface A
{
int m();
void others();
}interface B
{
void m();
void anthers();
}class Test implements A , B
{
//这里对m()如何处理才行? 假设上面的情况在某个已经完成的项目中真的存在了!!! void others() { }
void anthers() { }
}第二种情况
interface A
{
void m();
void others();
}interface B
{
void m();
void anthers();
}class Test implements A , B
{
//这里对m()这样做是可以的,但怎么知道他重写的是哪一个接口的void m()呢?请说说程序本身的处理过程。
void m() { }
void others() { }
void anthers() { }
}
我知道上面的问题网上有不少相关的解答,但不能令人满意。希望哪位能来讲解透彻些,令大家信服。
interface A
{
int m();
void others();
}interface B
{
void m();
void anthers();
}class Test implements A , B
{
//这里对m()如何处理才行? 假设上面的情况在某个已经完成的项目中真的存在了!!! void others() { }
void anthers() { }
}第二种情况
interface A
{
void m();
void others();
}interface B
{
void m();
void anthers();
}class Test implements A , B
{
//这里对m()这样做是可以的,但怎么知道他重写的是哪一个接口的void m()呢?请说说程序本身的处理过程。
void m() { }
void others() { }
void anthers() { }
}
我知道上面的问题网上有不少相关的解答,但不能令人满意。希望哪位能来讲解透彻些,令大家信服。
第一种情况 Java codeinterface A
{
int m();
void others();
}interface B
{
void m();
void anthers();
}class Test implements A , B
{
//这里对m()如何处理才行? 假设上面的情况在某个已经完成的项目中真的存在了!!! void others() { }
void anthers() { }
}
第二种情况 Java codeinterface A
{
void m();
void others();
}interface B
{
void m();
void anthers();
}class Test implements A , B
{
//这里对m()这样做是可以的,但怎么知道他重写的是哪一个接口的void m()呢?请说说程序本身的处理过程。
void m() { }
void others() { }
void anthers() { }
}
{
int m();
void others();
} interface B
{
void m();
void anthers();
} class Test implements A , B
{
//这里对m()如何处理才行? 假设上面的情况在某个已经完成的项目中真的存在了!!! void others() { }
void anthers() { }
}
第二种情况 interface A
{
void m();
void others();
} interface B
{
void m();
void anthers();
} class Test implements A , B
{
//这里对m()这样做是可以的,但怎么知道他重写的是哪一个接口的void m()呢?请说说程序本身的处理过程。
void m() { }
void others() { }
void anthers() { }
}
这种情况的确存在。
LinkedList类中的add方法就是来自多个接口:
public boolean add(E e)将指定元素添加到此列表的结尾。
此方法等效于 addLast(E)。
指定者:
接口 Collection<E> 中的 add
指定者:
接口 Deque<E> 中的 add
指定者:
接口 List<E> 中的 add
指定者:
接口 Queue<E> 中的 add
覆盖:
类 AbstractList<E> 中的 add
参数:
e - 要添加到此列表的元素
返回:
true(根据 Collection.add(E) 的规定)肯定你只需要一个m方法,java也没有机制让你定义多个相同签名的方法。
既然Test类实现了A,B接口,就必须覆盖所有的抽象方法;
但是两个m()是无法同时在一个类中实现的,因为它们都是无参的同名方法,所以无法进行重载:
.....
int m(){ }
void m() { } //这样写必定报错
.....
可以参考3楼所说的第二种情况:
对于一个同时实现了两个都含有void m()的接口的类来说,
它必须必须覆盖掉所有的抽象方法,而根据你所说的:
void m() { } //可行
void others() { }
void anthers() { }
说明:这里已经不存在“哪一个接口的void m()”这个说法,因为如果存在以上的说法,那么就代表只重写了其中一个接口的void m(),
而这与第一种情况是矛盾的;
再者,对于两个形式完全相同的抽象方法,根本就没有必要知道重写的是哪一个接口的void m(),没有任何意义
指定者:
接口 List <E> 中的 add
指定者:
接口 Queue <E> 中的 add他们里的ADD好像都是继承的Collection 的吧?
如果硬是有这种情况,只能绕道,比如用适配器模式:
添加一个新的接口。代码例子如下:interface A{
void m();
}
interface B{
int m();
}
interface C{
int m2();
B getB();
}public class Test implements A,C{
public void m() {
} public int m2() {
return 0;
} public B getB() {
return new B(){
public int m() {
return m2();
}
};
}
public static void main(String[] args) {
Test t=new TestInterface();
B b=t.getB();//这里不能用 B b=(B)t;了!
t.m();
}
}
不过遇到这样的设计做程序员的有什么办法,只能将错就错了,要么像25楼说的那样,引入新的接口,要么就把业务写在两个实现类里,分别调用。
不知道写在一起目的是为了什么,分开难道就不能满足业务逻辑????
第二种的话,接口是是负责给别人调用的,他的业务都在实现类里处理,即不管你调用的是哪个接口的方法,他最终还是执行实现类里的方法,本身没有任何意义,你想调用哪个都可以。目的只有一个。
至于3楼的说法,24楼已经说的很清楚了,因为他们有一个共同的父类Collection,只是继承了父类的add而已。本身并没有这个接口。引用:
24楼说:“他们里的ADD好像都是继承的Collection 的吧?”
a.m();B b = new Test();
System.out.println(b.m());
不失一般性,如果楼主的两个接口作如下修改:
interface A {
java.io.InputStream m();
}interface B {
java.net.Socket m();
}class Test implements A, B{
// 如何实现省略
}class TestClass {
public static void main(String[] args){
// 下面的这种情况是很不可思议的
Test obj = new Test();
A a = obj;
B b = obj;
java.io.InputSteam is = a.m();
java.net.Socket socket = a.m();
}
}
我觉得这种情况存在,比如说你用到别人提供的接口?两个接口都是三方的,而恰好就出现这种情况了!
我觉得25楼的方法好,转接口!或者,我想到的是,自己对新建一个类,先实现了其中一个接口。class C implements A{
int m(){};
public mC(){m();};
}
利用Override mC()来转
Java的措施是,对第2种情况,简单地将两者合并;条件是不得出现第一种情况。如果两个接口都是三方的,你事实上没有办法让一个类同时实现这两个接口。这里要注意的问题是,接口隐藏了实现类的类型。
foo(A a,B b){
a.m();
b.m();
}
既然你的实现类T对象无法同时作为A、B类型的实例,即
T t = new T();
foo(t,t);//没有办法你就知道你该怎么办了。比如2个类分别实现,一个类+一个内部类。