我正在尝试调用一个方法,setPostal(String post)
我是从一个匿名类创建的,但由于某种原因,编译器在缅因州甚至无法识别它。这是有什么原因吗?我的代码的一部分(地址是Student的内部类):
Student
public class Student implements Gradeable, Cloneable {
String name;
int id;
Address address;
public Student() {
name = "unknown";
address = new Address();
}
public Student(String name, int id, Integer... option) {
this.name = name;
this.id = id;
if (option.length > 0) {
if (option[0] > 0) {
address = new Address() {
String postal;
public void setPostal(String post) {
postal = post;
}
@Override
public String toString() {
return "Street: " + street + " | number: " + number
+ " | town: " + town + " | province: " + province
+ " | Postal Code: " + postal;
}
};
}
} else {
address = new Address();
}
}
Address getAddress() {
return address;
}
void setAddress(Address address) {
this.address = address;
}
public static void main(String[] args) throws CloneNotSupportedException, InterruptedException {
Student test = new Student("ryan", 41254, 1);
test.getAddress().setPostal("L1G 6h9") // Compiler: Cannot resolve symbol 'setPostal'
}
}
Address
public class Address implements Cloneable {
String street;
int number;
String town;
String province;
String zip;
public Address() {
}
public Address(String street, int number, String town,
String province, String zip) {
this.street = street;
this.number = number;
this.town = town;
this.province = province;
this.zip = zip;
}
String getStreet() {
return street;
}
int getNumber() {
return number;
}
String getTown() {
return town;
}
String getProvince() {
return province;
}
String getZip() {
return zip;
}
@Override
public String toString() {
return "Street: " + street + " | number: " + number
+ " | town: " + town + " | province: " + province
+ " | ZIP: " + zip;
}
@Override
public boolean equals(Object obj) {
if (obj instanceof Address)
if (((Address) obj).getStreet().equals(street)
&& ((Address) obj).getNumber() == number
&& ((Address) obj).getTown().equals(town)
&& ((Address) obj).getProvince().equals(province)
&& ((Address) obj).getZip().equals(zip)){
System.out.println("Address equal");
return true;
}
System.out.println("Address not equal");
return false;
}
@Override
protected Object clone() throws CloneNotSupportedException {
return super.clone();
}
}
想必,无论怎样Address
是,它没有setPostal(String)
方法。
实例方法在编译时根据调用它们的值的类型进行解析。
你正在调用它
test3.getAddress().setPostal("L1G 6h9") //Compiler: Cannot resolve symbol 'setPostal'
在类型表达式上Address
,它没有这样的方法,不管子类型(匿名子类)有这样的方法。
调用仅在匿名类中声明的方法的唯一方法(减去反射)是对匿名类实例创建表达式返回的值调用该方法。
new Address() {
String postal;
public void setPostal(String post) {
postal = post;
}
@Override
public String toString() {
return "Street: " + street + " | number: " + number
+ " | town: " + town + " | province: " + province
+ " | Postal Code: " + postal;
}
}
}.setPostal("whatever");
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)