将对象传递给类时,如何访问它的变量/函数?

时间:2019-05-01 02:33:56

标签: java processing

我希望这听起来不会太愚蠢并且有意义。

class Test {
  int num;
  public Object obj;

  public Test(int num, Object obj){
    this.num = num;
    this.obj = obj;
  }

  int getNum(){
    return num;
  }

}

class Bird {
  public int size;

  public Bird(int size){
    this.size = size;
  }

  public void setSize(int size){
    this.size = size;
  }

  public int getSize(){
    return size;
  }

}
 void setup(){
   size(100, 100);

   Bird y = new Bird(7);
   Test x = new Test(4, y);

   //x.obj.size does not work
   //x.obj.getSize() does not work
 }

所以我有这两个文件。第一个具有类,第二个实际运行它。传入对象后,尝试访问该类的var或函数不起作用。有没有办法使这项工作?

我最初试图找到一种方法来制作一个ArrayList函数(没有Lambda),因为这变得毫无结果,我一直在考虑改变自己的方式。

我也曾尝试将public Object obj;改成public Bird obj;,但这并没有改变。

我走对了吗?有没有做这种事情的好方法?

我还将注意到这是在Processing 3.5中编写的。就像Java进行了小的语法更改一样,这就是为什么某些内容可能看起来不正确的原因。这也是为什么Lambda不起作用的原因。

谢谢!

2 个答案:

答案 0 :(得分:2)

如果变量类型为Object,则编译器仅“了解” Object类中的函数。

如果要使用更特定类型的功能,则必须投射变量,如下所示:

Bird z = (Bird) x.obj;
println(z.size);

请注意,这实际上并没有改变对象的类型,它只是告诉编译器期望什么类型。如果变量实际上不是Bird,那么它将失败。

或者您可以将obj变量更改为更特定的类型:

class Test {
  int num;
  public Bird obj;

  public Test(int num, Bird obj){
    this.num = num;
    this.obj = obj;
  }

  // ...

现在,您可以从Bird类访问这些功能:

println(x.obj.size);

无耻的自我促进:here是有关在Processing中创建类的教程。

答案 1 :(得分:0)

Kevin解释了这个问题。但是,您可以使用generics来告诉编译器您将要放入哪种类型,而不必限制类型或进行危险的转换,因为并不总是很容易保证对象的类型。

class Test<T> {
  int num;
  public T obj;

  public Test(int num, T obj){
    this.num = num;
    this.obj = obj;
  }

  int getNum(){
    return num;
  }

}

class Bird {
  public int size;

  public Bird(int size){
    this.size = size;
  }

  public void setSize(int size){
    this.size = size;
  }

  public int getSize(){
    return size;
  }

}
void setup(){
   size(100, 100);

   Bird y = new Bird(7);
   Test<Bird> x = new Test<>(4, y);
}