Iterable<Board> theNeighbors = new ArrayList<Board>();
这是ArrayList
theNeighbors的初始化,它使用interafce Iterable
进行声明。但是,当我将方法add()
用于刚刚构建的变量时,编译器会发出警报
Board.java:78:错误:找不到符号theNeighbors.add(nb); ^
符号:方法添加(Board)
location:变量类型为Iterable的邻居
是什么让它发生?在另一种情况下我使用
List<Board> theNeighbors = new ArrayList<Board>();
add()
方法效果很好。您为声明选择的界面是否应该始终具有您想要稍后调用的方法?
答案 0 :(得分:34)
如果您阅读Iterable
界面的documentation,您会看到,如您所述,add()
方法不存在。
您为声明选择的界面是否应始终具有您想要稍后调用的方法?
您选择的界面应具有您计划实例化和使用的对象的所有行为。
当您宣布ArrayList
时,这样:
Iterable<Board> theNeighbors = new ArrayList<Board>();
JVM将theNeighbors
视为Iterable
,因此无法找到add()
方法。另一方面,如果您以这种方式定义ArrayList
:
List<Board> theNeighbors = new ArrayList<Board>();
然后JVM 可以找到add()
方法,因为所有类型的List
都有此方法(和行为)。