必须实现抽象方法

时间:2019-05-07 17:50:53

标签: java interface processing

这使用的是Processing 3.5,并不是每个Java东西在这里都一样。
Bird类给我的错误是它需要实现call()。它已经不是主要的吗?我对界面没有经验,所以我不知道这里到底发生了什么。

 public interface FuncCall<A> {
   A call();
 }

 class Bird implements FuncCall{
    //Error here ^
    //The type FuncCallTest.Bird must implement the inherited abstract method FuncCallTest.FuncCall.call()
    //Is this not implemented already under main?

   float x, y, size;
   ArrayList<FuncCall<Float>> inputs = new ArrayList<FuncCall<Float>>();

   public Bird(float x, float y, float size){
     this.x = x;
     this.y = y;
     this.size = size;
   }

   public void main(String[] args){

     FuncCall<Float> getX = new FuncCall<Float>(){
       @Override
       public Float call(){
           return x;
         }
     };

     FuncCall<Float> getY = new FuncCall<Float>(){
       @Override
       public Float call(){
         return y;
       }
     };

     FuncCall<Float> getSize = new FuncCall<Float>(){
       @Override
       public Float call(){
         return size;
       }
     };

     inputs.add(getX);
     inputs.add(getY);
     inputs.add(getSize);

   }

 }

 class Pol {

   ArrayList<FuncCall<Float>> inputs = new ArrayList<FuncCall<Float>>();

   public Pol(ArrayList<FuncCall<Float>> inputs){
     this.inputs = inputs;
   }

   //public float call(ArrayList<FuncCall<Float>> arr, int index){
     //return arr.get(index).call();
   //}
   //How do I do this? Do I need to implement the interface here as well? Because if so same error as on Bird

 }

我还将在此结尾附加这部分内容。 System.out.println(pol.call(pol.inputs, 1));
那行得通吗?编译前不会出错。
感谢您的帮助。请问是否没有什么意义,因为我仍然是新手,而不是java的最佳选择。 :)
主文件:

 void setup(){

   Bird bird = new Bird(1.2, 3.2, 7.5);
   Pol pol = new Pol(bird.inputs);
   System.out.println(pol.call(pol.inputs, 1););
 }

1 个答案:

答案 0 :(得分:0)

首先,您可以跳过FuncCall接口并使用Java的Supplier功能接口,而只需将这些类对象getter的这些Suppliers方法引用分别添加到列表中。 另一种方法是提供一个具有x,y和size的getter和/或成员变量的接口或抽象类,并将该接口或抽象类用作列表的类型参数。

  1. 与供应商: 这更接近您的示例,并且需要更少的更改 您的代码。 接口的第二个选项更改您的Pol类 完全可以确定,我不确定这是否可以接受。

´

public class Bird {

      private float x;
      private float y;
      private float size;

       public Bird(float x, float y, float size) {
           //set your members here
       }

       public Float getX() {
            return this.x;
        }

        public Float getY() {
            return this.y;
        }

         public Float getSize() {
             return this.size;
          }
}

´ 然后是Pol类

public class Pol {

    private final List<Supplier<Float>> inputs;

    public Pol(List<Supplier<Float>> inputs) {
         this.inputs = inputs;
     }

     public Float call(int index) {
         return this.inputs.get(index).get();
     }
}

´ 而且您的主体应该看起来像

public static int main(String[] args) {

    Bird bird = new Bird(1.0f, 1.0f, 2.5f);

     Pol pol = new Pol(Arrays.asList(bird::getX, 
     bird::getY, bird::getSize));
     Float birdsSize = pol.call(2);

     return 0;
}

´