如何使用interface作为参数?

时间:2016-12-23 09:53:34

标签: java class interface ejml

我正在使用EJML,我想使用类LinearSolver_B64_to_D64,它具有构造函数:LinearSolver_B64_to_D64(LinearSolver<BlockMatrix64F> alg),接口为LinearSolver<BlockMatrix64F>,类已经实现了LinearSolver

我所知道的: 通常,您创建一个接口,而不是在特定类中实现该接口。 我读到了将接口作为参数的函数(在特定的类中),因为这样你的函数不需要知道关于类的东西。

我的问题: 我不知道如何初始化类LinearSolver_B64_to_D64,因为我不知道如何将接口作为参数传递。

更新 我尝试了以下代码:

public class UseMatrixInterface{
    public UseMatrixInterface(){    
    }

    public void do1(){
        DenseMatrix64F a = new DenseMatrix64F(3,3);
        LinearSolver_B64_to_D64 ls = new LinearSolver_B64_to_D64(null); 

//it throws a nullpointer exeption. I assume, it is because i used null
//instead of the requiered parameter.
        ls.invert(a);
        a.print();
    }

    public void do2(){
        LinearSolver<BlockMatrix64F> lsD;
        LinearSolver_B64_to_D64 ls = new LinearSolver_B64_to_D64(lsD);
        //not working, because lsD cannot be initialised;
    }
}

3 个答案:

答案 0 :(得分:1)

研究javadoc;比如从这里开始接口LinearSolver

猜猜:有一个部分

所有已知的实施类:AdjLinearSolverQr_D64,...

去挑选符合你需求的那个;并创建该类的实例

因此,您的问题的答案是:您无法实例化接口。相反,你会寻找实现接口的类,然后创建这样一个类的实例。喜欢在:

List<String> strings = new ArrayList<>();

答案 1 :(得分:1)

不确定这个问题和这些答案是怎么回事。 LinearSolver_B64_to_D64是一个低级类,用于将块矩阵的线性解算器转换为标准DenseMatrix64F。你可能不想使用它。

手册:

LinearSolverFactory是创建新LinearSolver的首选方式,并隐藏了大部分低级详细信息。

答案 2 :(得分:0)

  • 创建实现接口的类的实例。很可能接口契约(接口的JavaDoc)非常简单,可以作为匿名内部类

    执行此操作
    LinearSolver<BlockMatrix64F> alg = new LinearSolver<BlockMatrix64F>(){
      // implement interface method(s) here
    }   
    

然后

  • 将该对象传递给LinearSolver_B64_to_D64()

    的构造函数
    LinearSolver_B64_to_D64(alg);