的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,例如MyClass
not myClass
。myClass
看起来像一个变量或字段。您不必遵循约定,但这样做有助于人们阅读您的代码。