7

java如何做到一个类不直接实现一个接口的情况下,通过该类调用该接口的方法?

 3 years ago
source link: https://www.oschina.net/question/4631206_2320721
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

java如何做到一个类不直接实现一个接口的情况下,通过该类调用该接口的方法?

osc_73936194 发布于 今天 16:59

已知三个角色,最少必须是三个角色,一个接口A,一个类C,一个接口B,C类实现了A接口,B接口也继承了A接口.,A接口有方法,B接口通过默认方法扩展重写了A接口的一些方法。

C类接口并没有实现接口B,但是c类接口和接口B的关联性是A接口。

那么C类接口如何通过A接口去调用B接口的方法?

更简单说明:C类要通过B接口进行操作调用,但c类有没有实现b接口,在c类不直接实现b接口的情况下,要如何做到?

C c=new C();

A a=C;

B b=(B)a;   //这一句话会报错,ClassCastException异常

kakai
33分钟前

方案一:在C类中new一个B,并实现B中非default方法的其它接口方法,此时B接口对象实体为C类的一个内部属性,可以随意访问B的各个方法。

方案二:使用CgLib动态为C类实现B的接口,那么在运行期,C类则继承了B的所有方法。

tcxu
B 是接口,如何调用操作符 new 创建一个 B 接口类型的实体?
tcxu
  1. 楼主的第二行代码 :"A a=C;" 是否应写成 "A a=c;"? 
  2. 只有 类 C 继承 接口 B, 它的实体/对象 才可以名正言顺地成为 A 或 B 接口 类型 的实体。 
interface A{
	void methodA();	
}

class C implements B{ 
	public void methodA(){
		System.out.println("调用methodA()");
	};
	public void methodB(){
		System.out.println("调用methodB()");
	};		
}

interface B extends A{
		void methodB();
}

public class T {
 public static void main(String args[])  {
 	C c=new C();
 	A a=c;
 	B b=(B)a;
	b.methodA();
	b.methodB();
	}
}

DOS 窗口:

D:\java\test\OS_China>javac T.java

D:\java\test\OS_China>java T
调用methodA()
调用methodB()

D:\java\test\OS_China>

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK