大家好,我的问题简单的来说,就是在程序中的一个接口引用,来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()方法),难道就只能把接口引用改成实现类引用了吗?

解决方案 »

  1.   

    强转为子类或者在接口中添加该方法-使得两者之间为“is-a”的关系
      

  2.   

    向下转型MyInterface  mi = new MyClass();
    MyClass myClass = (MyClass)mi;
    myClass.newMethod();
      

  3.   

    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
      

  4.   


    我觉得你这样用完全违反了java 的原理,相当于无中生有,没有什么实际意义。
      

  5.   

    用反射可以,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);
                    }
                }
            }
        }
    }
      

  6.   

    你用接口就是为了规范用户传入同一标准的对象,然后你又要处理特例,那你这个接口意义何在?
    你应该在新类的接口方法里去调用你的newMethod()
    实在不行,就定义另一个接口,然后新类实现新的接口,在你的处理里判断一下新类是否instance of你的新接口,是的话就调用新方法
      

  7.   

    强转一下就可以调用了
     
    ((MyClass)mi).newMethod(); //这里可以看作是MyClass mc = new Myclass(); //加上之前写的MyInterface  mi = new MyClass();    MyClass();就被创建了两遍
    //所以可以用上面的方法直接强转