Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/325.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 从正在返回的接口强制转换?它总是安全的吗?_Java_Casting_Type Safety - Fatal编程技术网

Java 从正在返回的接口强制转换?它总是安全的吗?

Java 从正在返回的接口强制转换?它总是安全的吗?,java,casting,type-safety,Java,Casting,Type Safety,假设我有以下功能: public Set<String> giveUp() { Set<String> alreadyGuessed = guessed; guessed = new LinkedSet<String>(); //fill Guessed with possible words anag(currentWord, ""); //Remove ones already guessed Itera

假设我有以下功能:

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;
}
公共设置放弃()
{
设置为已猜测=已猜测;
猜测=新链接集();
//用可能的单词填充猜测的单词
anag(当前单词“”);
//去掉那些已经猜到的
迭代器alGuessIterator=alreadyGuessed.Iterator();
而(!algusticator.done())
{
move(algusticator.get());
algusticator.advance();
}
返回猜测;
}
当我调用此函数并尝试使用以下行存储它时:

LinkedSet<String> notGuessed = (LinkedSet<String>)wordGame.giveUp();
LinkedSet notGuessed=(LinkedSet)wordGame.giveUp();
无论上述功能的内部实现如何,这是否始终是安全的?换句话说,你猜不到它是一个ArraySet,而且它仍然保持着一个完美安全的演员阵容吗?或者我误解了接口被返回的意义,我只是被认为有“设置不猜测”来防止强制转换的需要


我的老师在课堂问题上毫无用处,如果我进行任何不安全的施法,他也会立即给我0分。

不,除非返回类型与你正在施法的类型完全相同,否则你的施法将失败


阅读这篇文章来理解这是不安全的,因为你不能确定底层类型。如果您只需要访问
Set
界面定义的方法,则应使用:

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

如果这恰好是一个
链接集
,您的代码将“工作”,但如果不是,您将得到一个
ClassCastException
。如果出于任何原因需要它成为
LinkedSet
,则
giveUp()
方法应显式返回
LinkedSet

否,您将返回Set并强制转换到LinkedSet

如果你改变

Set<String> alreadyGuessed = guessed;
guessed = new LinkedSet<String>();
Set-alreadyGuessed=猜测;
猜测=新链接集();

Set-alreadyGuessed=猜测;
猜测=新HashSet();
您将有一个classcastexception


链接集是一个集合,但集合不一定是链接集。除非您在代码中使用特定于Linkedset的方法,否则只需删除强制转换。

对于仅在本地使用的内容,最好不要使用全局字段。在这种情况下,您应该在本地声明
gustized
,然后让
anag
返回一些内容

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


至于您询问的实际问题,让方法返回一个
链接集
,那么您就不必担心强制转换。

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

太棒了。很高兴看到我的两个理论中至少有一个是正确的。感谢您提供引发的异常。是的,因此我问这个问题,我是否可以返回接口。我没有意识到Java允许只声明一个接口就可以从方法中的return语句获取它。。。但与问题完全无关。正如你们所知,这是一个GUI和一个类之间的关系。这意味着彼此之间超出了范围。放弃不应该是制造更多猜测的工作!每个方法都应该有一个任务。要完成更复杂的任务,建立更多的方法。一个方法应该完全按照它的名字所说的去做。这样,在调试时,您可以阅读一个方法调用并说“哦,我知道它做了什么”-但是当您编写方法做得更多的代码时,您不知道任何事情会做什么,并且会感到困惑,如上所述。非常感谢您提供的链接。如果我的老师真的教全班,而不是吹嘘他写的课本,那就太好了。很高兴这对你有帮助。喜欢编码。“我的老师在课堂问题上毫无用处”——这有点粗鲁。如果他读到这篇文章,你认为会发生什么???
Set<String> alreadyGuessed = guessed;
guessed = new HashSet<String>();