说我有功能:

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

10-04 14:24