incompatible types found : void, what is wrong?

2019-08-09 03:11发布

问题:

I am trying to write a class that find the closest two vectors and return a sum.

I have tried to understand so hard but I can't find the reason why I get this message, it's the only error I get:

java:93: incompatible types found : void required: EDU.gatech.cc.is.util.Vec2 result = one.add(two); ^

Line 93 is at the end of the code, I put some arrows to indicate it!

enter code here


package EDU.gatech.cc.is.clay;


import java.util.*;
import EDU.gatech.cc.is.clay.*;
import java.lang.*;
import EDU.gatech.cc.is.abstractrobot.*;
import EDU.gatech.cc.is.util.Vec2;
import EDU.gatech.cc.is.util.Units;


public class MAX_go_in_between extends NodeVec2
{
  public static final boolean DEBUG = /*true;*/ Node.DEBUG;
  private SocSmall abstract_robot;


  public MAX_go_in_between(SocSmall ar)
  {
    abstract_robot = ar;


  }

  long last_spott = 0;
  Vec2 result = new Vec2();



  public Vec2 Value(long timestamp)
  {


    if (DEBUG) System.out.println("MAX_Avoid_walls: Value()");

    if ((timestamp > last_spott) || (timestamp == -1))
    {
      if (timestamp != -1) last_spott = timestamp;


      Vec2 one;
      Vec2 two;

      //array of Vec2 of all the opponents
      Vec2[] list_opp = abstract_robot.getOpponents(timestamp);
      //empty array of vec2 where will be put the opponents in front of the robot
      ArrayList<Vec2> list_opp_in_front;

      Vec2 temp;


      // find which opponents are in front and put them in the arraylist
      for(int i=0; i<list_opp.length; i++)
      {
        temp = list_opp[i];

        if(temp.x >= 0.0)
        {
          list_opp_in_front.add(temp);
        }
      }

      //get closest opponent and sets it to index 0
      for(int i=1; i<list_opp_in_front.size()-1; i++)
      {
        temp = list_opp_in_front.get(i);

          if(list_opp_in_front.get(0).r<temp.r)
        {
          list_opp_in_front.set(i, list_opp_in_front.get(0));
          list_opp_in_front.set(0, temp);

        }
      }

      //get second closest opponent and sets it to index 1
      for(int i=2; i<list_opp_in_front.size()-1; i++)
      {
        temp = list_opp_in_front.get(i);

          if(list_opp_in_front.get(1).r<temp.r)
        {
          list_opp_in_front.set(i, list_opp_in_front.get(1));
          list_opp_in_front.set(1, temp);
        }

          // sum both vectors
          one = list_opp_in_front.get(0);
          two = list_opp_in_front.get(1);

 =============>>>>
 =============>>>>   result = one.add(two);
          }

      }

      return(result);
    }

  }



Here is the Vec2.add(Vec2) method:


 public void add(Vec2 other)
  {
  x = x + other.x;
  y = y + other.y;
  r = Math.sqrt(x*x + y*y);
  if (r > 0)
   t = Math.atan2(y,x);
  }

回答1:

result = one.add (two);
public void add (Vec2 other)
//     ^^^^

From this, the member function add does not return anything that you can put into result. With a line like:

x = x + other.x;

(where x is a member of "the current object" and other is the object you're adding to it), it's a dead certainty that one.Add (two) is meant to modify one rather than just use it in a calculation.

So, rather than:

one = list_opp_in_front.get (0);
two = list_opp_in_front.get (1);
result = one.add (two);

you'll probably need something like:

result = list_opp_in_front.get (0);
two = list_opp_in_front.get (1);
result.add (two);


回答2:

As per your method declaration public void add(Vec2 other), you are adding two into one. Thus one itself is your result, hence there no need of return.

just remove the return statement and treat one as result object.