有一个PieChartDataProvider接口,定义如下
public interface PieChartDataProvider { public PieChartData getPieChartData();
.......
}有一个实现这个接口的类PieChartView,里面覆写了接口的getPieChartData()方法public class PieChartView extends AbstractChartView implements PieChartDataProvider {
....... @Override
public PieChartData getPieChartData() {
return data;
} .......
}
在另一个类中,
public class PieChartRenderer extends AbstractChartRenderer {private PieChartDataProvider dataProvider; //定义接口dataProvider;
.........;...final PieChartData data = dataProvider.getPieChartData(); //为什么接口可以直接调用类?
//我找遍了整个项目,都没有类似PieChartDataProvider dataProvider = new PieChartView();这样的实现代码。
//一个接口如果没有给它赋值为实现类的实例,是怎么直接调用接口方法的?}

解决方案 »

  1.   

    就算这个private PieChartDataProvider dataProvider; 真的没有用一个它的实现类进行初始化,你也是可以调用这个接口的方法的啊,编译的时候是不会有问题的!只不过这个变量为null,在运行的时候会抛异常而已!
    你在调用这个接口方法的地方设个断点调试一下呗,若其值不为null,则肯定有其它地方赋值或初始化了(利用Spring之类的)!
      

  2.   

    spring 注入?
      

  3.   


    这是一个android项目,也能用spring注入吗?用ctrl+H查询了一下也没有看到对于这个接口有什么映射的配置
      

  4.   

    接口调用方法一点问题都没有。再找一下肯定有地方为dataProvider赋值的,或者看一下父类中有没有public的 dataProvider。
      

  5.   

    interface Person {
        String getName();
    }class A implements Person{
    @Override
        public String getName(){
            return "1";
            }
    }class B implements  Person{    @Override
        public String getName() {
            return "1";
        }
    }class C{
        private  static Person p  ;    public static String get(){
             return getPs().getName();
        }    private static Person getPs() {
            return p;
        }
    }
    public class Main {    public static void main(String[] args) {
            System.out.println(C.get());
        }
    }名字为Main.java,不知道是否重现了你的问题,只是接口是可以调用的,但是运行报空指针.
      

  6.   


    那么如果没有在显性的代码里面初始化,有没有办法把它被初始化的地方找出来?
    如果用的是spring,你找找相关的.xml配置文件!如果不是,用编译器的查找引用功能啊!实在找不到,最简单的就是调试下,看其值是不是null就好了
      

  7.   

    直接调用接口中的方法,其实是这样的,我的项目就是这么做的。
       首先,要在当前类中写一个构造方法(以我的项目为例):
    private LessonsService lessonBiz=null;
    public AdminLessonAction(){
    lessonBiz=AbstractServiceFactory.newInstance(SystemConfig.ServiceFactoryType).createLessonsService();
    }//构造方法
    这里,先前要定义一个类AbstractServiceFactory:public abstract class AbstractServiceFactory
    {
        public static AbstractServiceFactory newInstance(String type){
            AbstractServiceFactory fac=null;
            try
            {
                fac=(AbstractServiceFactory)Class.forName(type).newInstance();
            }
            catch (Exception e){}
            return fac;
        }
     要定义一个类SystemConfig:
    public class SystemConfig
    {//此类中只有属性。
        public static String ServiceFactoryType;
           }
    关键是下一步:
    属性ServiceFactoryType,其实是servlet的param-name,可以在web.xml中找到。代码帖上:
    <context-param>
         <param-name>ServiceFactoryType</param-name>
      <param-value>com.factory.ServiceFactory</param-value>
    </context-param>
    下面就是要在com.factory.ServiceFactory类中写方法,代码如下:
    public class ServiceFactory extends AbstractServiceFactory
    {    @Override
        public FailService createFailService()
        {
            return new FailServiceImpl();
        }}
    看到了吗?实现接口的类,是在这里呢!!! return new FailServiceImpl();