我希望这听起来不会太愚蠢并且有意义。
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不起作用的原因。
谢谢!
答案 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);
}