我正试图(出于教育原因)将Java代码重写为PHP。它在这个存储库中。我的问题是42号线。我们可以在那里看到以下代码:
if (this.getBoard().getTile(boxNextPlace) instanceof ContentOperations &&
((ContentOperations)this.getBoard().getTile(boxNextPlace)).getContent() == null)
{
...
作为第一步,我们检查this.getBoard().getTile(boxNextPlace)
是否返回实现ContentOperations
接口的对象。如果是,我们进入第二步,再次调用this.getBoard().getTile(boxNextPlace)
链,但这次我们将返回值强制转换为ContentOperations
,然后调用getContent
方法进行进一步处理(在本例中,将其与null、.getContent()==null
进行比较,但这与我的问题无关)。
据我所知,在这种情况下,强制转换是一种保护,可以防止调用对象未实现的方法,但this.getBoard().getTile(boxNextPlace) instanceof ContentOperations
条件已经证明了这一点,即对象是ContentOperations
类型的。
所以问题是:如果一个对象被证明是所需的类型,为什么将它强制转换到它的接口是必要的?或者也许我对铸件这种保护功能的理解是错误的?
编写Java代码的人在第42行进行了instanceof
检查,但他们忽略了在第55行再次进行检查。如果getTile()
真的可以返回一个不是ContentOperations
的对象,那么就会出现ClassCastException
。我假设您不需要PHP中的任何额外逻辑来解释不同的返回类型。