大家好,我的问题简单的来说,就是在程序中的一个接口引用,来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()方法),难道就只能把接口引用改成实现类引用了吗?
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()方法),难道就只能把接口引用改成实现类引用了吗?
MyClass myClass = (MyClass)mi;
myClass.newMethod();
涉及的向上转型,向上转型后,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
我觉得你这样用完全违反了java 的原理,相当于无中生有,没有什么实际意义。
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);
}
}
}
}
}
你应该在新类的接口方法里去调用你的newMethod()
实在不行,就定义另一个接口,然后新类实现新的接口,在你的处理里判断一下新类是否instance of你的新接口,是的话就调用新方法
((MyClass)mi).newMethod(); //这里可以看作是MyClass mc = new Myclass(); //加上之前写的MyInterface mi = new MyClass(); MyClass();就被创建了两遍
//所以可以用上面的方法直接强转