关于接口引用调用实现类新方法的问题

backet007 2016-01-30 02:50:53
大家好,我的问题简单的来说,就是在程序中的一个接口引用,来new一个实现类的对象,但是如果用到了实现类中一个新的方法,这个方法没有在接口定义,应该怎么解决这个问题呢?例如:

interface MyInterface {
void method();
}

public class MyClass implements MyInterface {

@override
void method(){}

void newMethod(){}
}

public class Test {
public static void main(String[] args) {
MyInterface mi = new MyClass();
mi.method(); //可以调用
mi.newMethod(); //出错,无法调用
}
}

如上述简单的例子,我们都知道MyInterface的引用mi是无法调用newMethod()的,但是又不想在接口中添加这个方法(为了避免其它实现了这个接口的类也要实现newMethod()方法),难道就只能把接口引用改成实现类引用了吗?
...全文
1187 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
鬼墨GM 2019-10-08
  • 打赏
  • 举报
回复
强转一下就可以调用了 ((MyClass)mi).newMethod(); //这里可以看作是MyClass mc = new Myclass(); //加上之前写的MyInterface mi = new MyClass(); MyClass();就被创建了两遍 //所以可以用上面的方法直接强转
  • 打赏
  • 举报
回复
用反射可以,

public class MyClass implements MyInterface {
private static Logger logger = LoggerFactory.getLogger(MyClass.class);

@Override
public void method() {
logger.info("实现的方法");
}
public void newMethod(){
logger.info("新增的方法");
}

public static void main(String[] args) {
MyInterface mi = new MyClass();
Method[] methods = mi.getClass().getMethods();
for (Method method : methods) {
method.setAccessible(true);
if (method.getName().equals("newMethod")){
try {
method.invoke(mi);
} catch (IllegalAccessException | InvocationTargetException e) {
logger.info(e.getMessage(),e);
}
}
}
}
}
qq_39936465 2019-09-19
  • 打赏
  • 举报
回复
引用 楼主 backet007 的回复:
如上述简单的例子,我们都知道MyInterface的引用mi是无法调用newMethod()的,但是又不想在接口中添加这个方法(为了避免其它实现了这个接口的类也要实现newMethod()方法),难道就只能把接口引用改成实现类引用了吗?
我觉得你这样用完全违反了java 的原理,相当于无中生有,没有什么实际意义。
m20143310 2019-09-19
  • 打赏
  • 举报
回复 1
是个好问题!
qybao 2019-09-19
  • 打赏
  • 举报
回复
你用接口就是为了规范用户传入同一标准的对象,然后你又要处理特例,那你这个接口意义何在?
你应该在新类的接口方法里去调用你的newMethod()
实在不行,就定义另一个接口,然后新类实现新的接口,在你的处理里判断一下新类是否instance of你的新接口,是的话就调用新方法
BigHome 2019-07-19
  • 打赏
  • 举报
回复
MyInterface mi = new MyClass(); 涉及的向上转型,向上转型后,mi只可以调用MyInterface的方法(这里包括MyClass重写的方法和MyInterface未被重写的方法); 若是想调用MyClass新建的方法,有两种实现: 1.MyClass mc= new MyClass(); mc.newMethoud(); 2.MyInterface mi = new MyClass();//先向上转型 MyClass myClass = (MyClass)mi;//在向下转型 myClass.newMethod(); 向下转型在这里看起来像是多余的,但在Java的泛型编程里边用处很大; 想了解多写可以看一下链接:https://blog.csdn.net/xyh269/article/details/52231944
清泉流 2016-02-01
  • 打赏
  • 举报
回复
强转为子类或者在接口中添加该方法-使得两者之间为“is-a”的关系
厚黑之境 2016-02-01
  • 打赏
  • 举报
回复
向下转型 MyInterface mi = new MyClass(); MyClass myClass = (MyClass)mi; myClass.newMethod();
soton_dolphin 2016-02-01
  • 打赏
  • 举报
回复
接口是对象之间的一个合约,外部的对象只能够调用接口提供的发方法,如果外部对象想调用接口中没有提供到的方法,说明你你接口的设计有问题或者程序的构架有问题,需要重新考虑一下设计
scmod 2016-01-31
  • 打赏
  • 举报
回复
只能用实现类...或者反射试下..
神的力量 2016-01-30
  • 打赏
  • 举报
回复 1
如果非要用到接口中没有定义的方法,这时候就要向下类型转換了,父类强转为子类,就可以调用了

62,616

社区成员

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

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