一个奇怪的问题,颠覆了我以前的认知,帮忙解惑一下吧!

cht19790826 2013-04-04 08:02:03
我定义了两个接口Programmer,BizAgent,两个类:一个是SoftEngineer类工程师类,一个Test测试类
工程师类SfotEngineer实现了接口Programmer,BizAgent,
测试类Test中有一条BizAgent bizAgent=(BizAgent)programmer;这不是表明一个接口能强制转化成另一个接口吗?但两个接口没有继承关系啊,它们属于平等的关系,怎么能强制转换呢?百思不得其解,请高手解惑!书上的详细代码如下:

/**
* 人接口
* @author Administrator
*
*/
public interface Person {
/**
* 返回人的姓名
* @return 姓名
*/
public String getName();
}
/**
*Programmer接口
*/
public interface Programmer extends Person {
/**
* 写程序代码。
*/
public void writeProgram();
}
/**
*BizAgent 接口
*/
public interface BizAgent extends Person{
/**
* 讲解业务
*/
public void giveBizSpeech();
}
/**
*软件工程师类
*/
public class SoftEngineer implements Programmer,BizAgent{
private String name;//软件工程师姓名
public SoftEngineer(String name){
this.name=name;
}
public String getName(){
return name;
}

public void giveBizSpeech(){
System.out.println("我会讲业务。");
}
public void writeProgram(){
System.out.println("我会写代码。");
}
}
/**
*测试类
*/
public class Test {
public static void main(String[] args) {
Programmer programmer=new SoftEngineer("小明");
System.out.println("我是一名软件工程师,我的名字叫"+programmer.getNam()+". ");
programmer.writeProgram();
BizAgent bizAgent=(BizAgent)programmer;
bizAgent.giveBizSpeech();
}

}
...全文
292 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
程序员一灯 2013-04-05
  • 打赏
  • 举报
回复
引用 4 楼 cht19790826 的回复:
引用 1 楼 racemark111 的回复:属于对象转型吧,对象转型分为向上转型和向下转型,Programmer programmer=new SoftEngineer("小明");这条语句属于向上转型,即父类引用指向子类对象.而BizAgent bizAgent=(BizAgent)programmer;中将programmer当作Person对象看待时,属于向下转型……

		Programmer programmer = new SoftEngineer("小明");
		BizAgent bizAgent = (BizAgent) programmer;
		bizAgent.giveBizSpeech();
将代码整理了下,原因是: new SoftEngineer("小明");//这个实例是Person的实例, BizAgent bizAgent = (BizAgent) programmer;//这里转换是这个实例的转换,而不是接口的转换。 如果楼主认为借口可以转换自己可以试试:BizAgent bizAgent = (BizAgent) Programmer
cht19790826 2013-04-05
  • 打赏
  • 举报
回复
引用 1 楼 racemark111 的回复:
属于对象转型吧,对象转型分为向上转型和向下转型,Programmer programmer=new SoftEngineer("小明");这条语句属于向上转型,即父类引用指向子类对象.而BizAgent bizAgent=(BizAgent)programmer;中将programmer当作Person对象看待时,属于向下转型,向下转型要通过强制类型转换 Java co……
BizAgent bizAgent=(BizAgent)programmer;中将programmer当作Person对象看待时,属于向下转型 关键是怎么能把programmer当做Person对象看,programmer可是接口啊,还是糊涂不清楚?
zoeg 2013-04-04
  • 打赏
  • 举报
回复
两个都是接口,强制类型转换的时候,如果是转换为接口编译器是无法确定正确性的,因为目标对象类型可以实现多个接口; 但如果是类型或者抽象类型,由于只能继承一个父类,编译器能够推测类型转换是否必然失败并给出提示!
nmyangym 2013-04-04
  • 打赏
  • 举报
回复
这样是否好理解一些:

        //BizAgent bizAgent=(BizAgent)programmer;
        SoftEngineer s = (SoftEngineer)programmer;//先向下转型
        BizAgent bizAgent = (BizAgent)s;          //再向上转型.
菜鸟级高手 2013-04-04
  • 打赏
  • 举报
回复
属于对象转型吧,对象转型分为向上转型和向下转型,Programmer programmer=new SoftEngineer("小明");这条语句属于向上转型,即父类引用指向子类对象.而BizAgent bizAgent=(BizAgent)programmer;中将programmer当作Person对象看待时,属于向下转型,向下转型要通过强制类型转换

class Person {
}

class Manager extends Person {
}

class Employer extends Person {
}

public class TestConvert {
	public static void main(String[] args) {
		Person p = new Manager();
		Employer e = (Employer)p;
	}
}
这个和你的示例差不多

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧