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_Generics - Fatal编程技术网

Java 如果调用泛型静态方法,编译器如何使用泛型信息?

Java 如果调用泛型静态方法,编译器如何使用泛型信息?,java,generics,Java,Generics,我有一个关于泛型类型的问题。我已经编写了自己的迭代器类型,如果没有可迭代的内容,我希望返回一个空迭代器 下面的代码可以工作 @Override public Iterator<MyType> iterator() { final Iterator<MyType> iter = Collections.emptyIterator(); return count > 0 ? new MyIterator() : iter; } @覆盖 公共迭代器迭代器

我有一个关于泛型类型的问题。我已经编写了自己的迭代器类型,如果没有可迭代的内容,我希望返回一个空迭代器

下面的代码可以工作

@Override
public Iterator<MyType> iterator() {
    final Iterator<MyType> iter = Collections.emptyIterator();
    return count > 0 ? new MyIterator() : iter;
}
@覆盖
公共迭代器迭代器(){
最终迭代器iter=Collections.emptyIterator();
返回计数>0?新建MyIterator():iter;
}
但是,如果这样写在一行中,则不起作用:

@Override
public Iterator<MyType> iterator() {
    return count > 0 ? new MyIterator() : Collections.emptyIterator();
}
@覆盖
公共迭代器迭代器(){
返回计数>0?新建MyIterator():Collections.emptyIterator();
}
我遇到一个错误,必须强制转换类型才能解决它:

@Override
public Iterator<MyType> iterator() {
    return (Iterator<MyType>)(count > 0 ? new MyIterator() : Collections.emptyIterator());
}
@覆盖
公共迭代器迭代器(){
返回(迭代器)(计数>0?新建MyIterator():Collections.emptyIterator());
}
此强制转换将导致未经检查的警告,在第一个示例中没有警告

当我将铸件移动到内部时,它也不起作用:

@Override
public Iterator<MyType> iterator() {
    return count > 0 ? new EdgeIterator() : (Iterator<MyType>) Collections.emptyIterator();
}
@覆盖
公共迭代器迭代器(){
返回计数>0?新建EdgeIterator():(迭代器)集合。emptyIterator();
}

我现在的问题是:为什么编译器不能在后面的示例中确定类型是正确的,而在第一个示例中是正确的。为什么变体3中的演员阵容有效,但在最后一个版本中无效?在我的印象中,所有变体基本上都是相同的。

如果您希望它工作,请使用以下语法:

 return Collections.<MyType>emptyIterator();
返回集合。emptyIterator();
这就是如何为静态方法提供泛型

如果调用
Collections.emptyIterator()
然后返回一个与返回类型不兼容的
迭代器


您也不能施放,因为
Iterator
没有扩展

像一个符咒一样工作。但是这个语法看起来真的很奇怪。我尝试过“Collections.emptyIterator()”,但那是错误的。然而,我仍然感兴趣的是为什么第一种情况下没有创建警告。@kap在第一种情况下,Java可以推断泛型类型。这里解释一下:有一个例子是
Collections.emptyList()