的elementAt方法Vector被定义为返回Object,但显然locations包含Restaurant条目。因此,为了访问这些Restaurant方法,您必须将返回的引用Object转换为Restaurant. 这就是该(Restaurant)部分(Restaurant)locn.elementAt(i);正在做的事情。
这是相当老式的代码。现代方法是使用Vector<Restaurant>(或者List<Restaurant>如果您不需要同步)和增强for循环:
class myClass
{
private List<Restaurant> locations;
private void distances()
{
List<Restaurant> locn = locations; // You don't really need to do this bit
if (locn!= null) {
for (Restaurant a : locn) {
a.setDistance(distanceToLocations(a));
}
}
}
private String distanceToLocations(Restaurant restaurant) {
// returns string
}
}
请注意,我已更改Vector为List. 您永远不会显示如何locations初始化,但List<Restaurant>您会执行以下操作:
this.locations = new ArrayList<Restaurant>();
// or
this.locations = new LinkedList<Restaurant>();
我猜你真的不需要同步。java.util但是,如果你这样做了,比有更好的选择Vector,例如使用Collections.synchronizedList来获取同步列表,或者使用java.util.concurrent. 而且您需要在循环期间进行同步。例如:
this.locations = Collections.synchronizedList(new ArrayList<Restaurant>());
接着
synchronized (locn) {
for (Restaurant a : locn) {
a.setDistance(distanceToLocations(a));
}
}
旁注:Java 代码中压倒性的约定是让类名以大写字符开头并使用 CamelCase,例如MyClassnot myClass。myClass看起来像一个变量或字段。您不必遵循约定,但这样做有助于人们阅读您的代码。