将对象传递到 class 时,我如何访问它的 vars/functions?

When passing an Object into a class how can I access it's vars/functions?

我希望这听起来不太愚蠢并且有道理。

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
 }

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

我最初试图找到一种方法来制作函数的 ArrayList(没有 Lambda),因为这变得徒劳无功,我考虑过改变我的方式。

我也试过将 public Object obj; 变成 public Bird obj; 并且这并没有改变任何东西。

我走在正确的轨道上吗?有做这样的事情的好方法吗?

我也会注意到这是用Processing 3.5写的。它类似于 Java,只是稍作语法更改,所以这就是为什么某些内容看起来不正确的原因。这也是 Lambda 不起作用的原因。

提前致谢!

如果你有一个Object类型的变量,那么编译器只会"knows"关于Objectclass.

里面的函数

如果您想使用更具体类型的函数,您必须转换变量,如下所示:

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 class:

访问函数
println(x.obj.size);

无耻的自我推销:here 是关于在 Processing 中创建 classes 的教程。

凯文解释了这个问题。但是,您可以使用 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);
}