将对象传递到 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"关于Object
class.
里面的函数
如果您想使用更具体类型的函数,您必须转换变量,如下所示:
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);
}
我希望这听起来不太愚蠢并且有道理。
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"关于Object
class.
如果您想使用更具体类型的函数,您必须转换变量,如下所示:
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);
}