说我有功能:
public Set<String> giveUp()
{
Set<String> alreadyGuessed = guessed;
guessed = new LinkedSet<String>();
//fill Guessed with possible words
anag(currentWord, "");
//Remove ones already guessed
Iterator<String> alGuessIterator = alreadyGuessed.iterator();
while (!alGuessIterator.done())
{
guessed.remove(alGuessIterator.get());
alGuessIterator.advance();
}
return guessed;
}
当我调用此函数并尝试使用如下代码行存储它时:
LinkedSet<String> notGuessed = (LinkedSet<String>)wordGame.giveUp();
无论上面功能的内部实现如何,这始终是安全的吗?换句话说,难道不能猜测为ArraySet并且它仍然保持完全安全的转换吗?还是我误解了返回接口的要点,而只是为了避免强制转换而应该设置“ Set notGuessed”?
我的老师在课堂上的问题上毫无用处,如果我进行任何不安全的投射,我也会立即给我0。
最佳答案
那将是不安全的,因为您不能确定基础类型。如果只需要访问Set
接口定义的方法,则应使用:
Set<String> set = wordGame.giveUp();
如果恰好是
LinkedSet
,您的代码将“起作用”,但如果不是,您将获得ClassCastException
。如果出于任何原因需要将其专门用作LinkedSet
,则giveUp()
方法应显式返回LinkedSet
。