最近我一直在查看很多代码(为了我的利益,因为我还在学习编程),我注意到一些Java项目(来自那些看起来很受尊敬的程序员)使用某种即时向下转换。
实际上,我有多个例子,但这是我从代码中直接提取出来的一个例子:
public Set<Coordinates> neighboringCoordinates() {
HashSet<Coordinates> neighbors = new HashSet<Coordinates>();
neighbors.add(getNorthWest());
neighbors.add(getNorth());
neighbors.add(getNorthEast());
neighbors.add(getWest());
neighbors.add(getEast());
neighbors.add(getSouthEast());
neighbors.add(getSouth());
neighbors.add(getSouthWest());
return neighbors;
}
同一个项目中,这里有另一个(也许更简洁)的例子:
private Set<Coordinates> liveCellCoordinates = new HashSet<Coordinates>();
在第一个示例中,您可以看到该方法的返回类型为
Set<Coordinates>
- 然而,该特定方法将始终只返回HashSet
,而不是任何其他类型的Set
。在第二个示例中,
liveCellCoordinates
最初被定义为Set<Coordinates>
,但是立即转换为HashSet
。而且这不仅仅是这个单独的项目——我发现在多个项目中都是如此。
我很好奇背后的逻辑是什么?是否存在某些代码约定认为这是良好的实践?它是否使程序更快或更高效?它有哪些好处?
Set
开始,然后转换为HashSet
(我认为HashSet
比Set
更具体)。这不是向下转型吗?因为我从广泛类型的Set
转换为特定类型的HashSet
? - BobHashSet
并在将其分配给liveCellCoordinates
时将其转换为Set
。在评估new
表达式之前不存在任何Set
对象,并且没有将Set
转换为HashSet
。 - Ted HoppSet
开始的,没想到实际上是相反的。 - Bob