访问预定义方法的通用参数

时间:2016-03-20 03:10:58

标签: java

我遇到以下情况:

  • 包“运算符”中的某些类,所有这些类都实现了一个接口Operator,其中包含要实现的方法tweak;
  • 包“local_search”中的某些类,并且所有这些类在构造函数方法中接收一个运算符os“operator”作为参数;
  • 我的主要类,我实例化了一个包“local_search”的类和一个包“operator”的运算符。

我的界面

package operators;

public interface Operator 
{
    public int[] tweak(int[] solution);
}

我的主要课程:

package fsp;

public class FSP {

    public static void main(String[] args) throws IOException, ClassNotFoundException, InstantiationException, IllegalAccessException 
    {
        RandomSwap operator = new RandomSwap();
        HillClimb hc = new HillClimb(operator);
    }
}

一类“local_search”:

package local_search;

public class HillClimb
{
   Object operator;

   public HillClimb(Object operator) 
   {
      this.operator = Class.forName(operator.getClass().getName()).newInstance();   
   }
}

我不知道我的HillClimb构造函数方法是否正确,但我没有编译或运行时错误。

我需要做的是,例如,在我的HillClimb类中:

public void start()
{
   int[] s = {1, 2, 3}
   operator.tweak(s);
}

如果我实现它,使用我给出的示例,我就不能调用tweak方法。有办法吗?

OBS :示例不是整个实现。我只保留必要的解释我的疑问。

EDIT1:当我调用operator.tweak(s)时,编译错误返回:The method tweak(int[]) is undefined for the type Object

2 个答案:

答案 0 :(得分:2)

由于您希望HillClimb构造函数仅将Operator类作为参数,因此您可以更新其构造函数以将Operator接口作为参数。

更新

  

对象运算符;

     

public HillClimb(Object operator){..}

  

操作员操作员;

     

公共HillClimb(运营商运营商)
  {
   this.operator = operator;
  }

这样你甚至不需要做Class.forName(...)并担心 ClassNotFoundException,InstantiationException,IllegalAccessException。

此外,这可以保证对象的类型为Operator,并且总会有一个调整方法。

使用当前代码,我甚至可以new HillClimb(new String()),稍后在调用start方法时会失败。

答案 1 :(得分:1)

将班级中的Object更改为Operator,您的所有问题都会消失:

public class HillClimb
{
    Operator operator;                  // <-- Change here

    public HillClimb(Operator operator) // <-- Change here
    {
        this.operator = operator;       // <-- Simplify this
    }
    public void start()
    {
        int[] s = {1, 2, 3}
        operator.tweak(s);
    }
}