0

说我有这个功能:

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();

不管上面函数的内部实现如何,这总是安全的吗?换句话说,不能Guessed 是一个ArraySet 并且它仍然保持一个完全安全的演员阵容吗?或者我是否误解了返回界面的意义,我只是应该有“Set notGuessed”来防止需要强制转换?

我的老师在课堂上的问题上毫无用处,如果我做任何不安全的铸造,也会立即给我0分。

4

5 回答 5

2

那是不安全的,因为你不能确定底层的类型。如果您只需要访问Set接口定义的方法,那么您应该使用:

Set<String> set = wordGame.giveUp();

如果这恰好是LinkedSet您的代码将“工作”,但如果不是,您将获得一个ClassCastException. LinkedSet如果您出于某种原因需要它是一个特定的,那么该giveUp()方法应该LinkedSet显式地返回一个。

于 2012-11-06T00:34:45.487 回答
0

ClasscastException不,除非返回类型与您正在转换的类型完全相同,否则您的转换将失败。

阅读这篇文章以了解为什么编程到接口

于 2012-11-06T00:34:34.887 回答
0

不,您将返回 Set 并转换为 LinkedSet。

如果你改变

Set<String> alreadyGuessed = guessed;
guessed = new LinkedSet<String>();

Set<String> alreadyGuessed = guessed;
guessed = new HashSet<String>();

你会有一个classcastexception。

链接集是集合,但集合不一定是链接集。除非您在代码中使用特定于 Linkedset 的方法,否则只需删除演员表。

于 2012-11-06T00:35:16.493 回答
0

对于仅在本地使用的事物,不使用全局字段会更好。在这种情况下,您应该guessed在本地声明,然后anag返回一些东西。

将事情保持在正确的范围内有时很烦人,但可以防止您在这里处理的确切类型的混乱。

至于你问的实际问题,让方法返回 a LinkedSet,那么你不必担心强制转换。

于 2012-11-06T00:35:50.273 回答
0

返回接口引用类型的整个想法是所有用户都应该对它提供的方法感到满意,而不必担心底层实现。如果你必须投,你做错了。

于 2012-11-06T00:36:30.757 回答