当前位置:  开发笔记 > 编程语言 > 正文

通配符和泛型错误

如何解决《通配符和泛型错误》经验,为你挑选了1个好方法。

下面的代码是一次性的,一个失败的想法让Enumeration在新的foreach循环中工作,但是我想让它编译,因为我一直遇到泛型和外卡的问题.无论出于何种原因,我都看不出如何修复它.

那么,需要进行哪些更改才能进行编译?

import java.util.Enumeration;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;
import java.util.zip.ZipEntry;
import java.util.zip.ZipFile;


public class Main
{
    private ZipFile zipFile;

    public Set entries()
    {
        final Set                             names;
        final Enumeration         enumeration;
        final IterableEnumeration iteratable;

        names = new HashSet();

        // zipFile.entries() returns "Enumeration"
        enumeration = zipFile.entries();

        // this line won't compile
        iteratable  = new IterableEnumeration(enumeration);

        for(final ZipEntry entry : iteratable)
        {
            if(!(entry.isDirectory()))
            {
                names.add(entry.getName());
            }
        }

        return (names);
    }
}

class IterableEnumeration
    implements Iterable
{
    private final Enumeration enumeration;

    public IterableEnumeration(final Enumeration e)
    {
        enumeration = e;
    }

    public Iterator iterator()
    {
        final EnumerationIterator iterator;

        // yeah cannot do this since an Iterable is supposed to work multiple times on the same object and Enumeration is descructive...
        iterator = new EnumerationIterator(enumeration);

        return (iterator);
    }
}

class EnumerationIterator
    implements Iterator
{
    private final Enumeration enumeration;

    public EnumerationIterator(final Enumeration e)
    {
        enumeration = e;
    }

    public boolean hasNext()
    {
        return (enumeration.hasMoreElements());
    }

    public T next()
    {
        return (enumeration.nextElement());
    }

    public void remove()
    {
        throw new UnsupportedOperationException("Cannt remove via an Enumeration");
    }
}

错误是:

Main.java:26: unexpected type
found   : ? extends java.util.zip.ZipEntry
required: class or interface without bounds
        iteratable  = new IterableEnumeration(enumeration);
                                             ^
1 error

erickson.. 5

构造参数化类型时,不能指定通配符.这是正确的语法:

iteratable  = new IterableEnumeration(enumeration);

正如您所指出的那样,实现Iterable一个Enumeration因为Enumeration是一次性使用很困难,而代码可以依赖于Iterable创建任意数量的新鲜Iterator对象.您可以在增强的for循环中安全地使用它,但将这样的传递Iterable给任何其他方法是不安全的.


奥斯卡是对的,上述改变是不够的.我忽略了底层enumeration是" ? extends ZipEntry" 的事实.此外,进行以下更改:

class IterableEnumeration
  implements Iterable
{

  private final Enumeration enumeration;

  public IterableEnumeration(final Enumeration e)
  {
    enumeration = e;
  }

  ...

class EnumerationIterator
  implements Iterator
{

  private final Enumeration enumeration;

  public EnumerationIterator(final Enumeration e)
  {
    enumeration = e;
  }

  ...

这些变化基本上意味着" IterableEnumeration可以与Enumeration任何子类型协作T."



1> erickson..:

构造参数化类型时,不能指定通配符.这是正确的语法:

iteratable  = new IterableEnumeration(enumeration);

正如您所指出的那样,实现Iterable一个Enumeration因为Enumeration是一次性使用很困难,而代码可以依赖于Iterable创建任意数量的新鲜Iterator对象.您可以在增强的for循环中安全地使用它,但将这样的传递Iterable给任何其他方法是不安全的.


奥斯卡是对的,上述改变是不够的.我忽略了底层enumeration是" ? extends ZipEntry" 的事实.此外,进行以下更改:

class IterableEnumeration
  implements Iterable
{

  private final Enumeration enumeration;

  public IterableEnumeration(final Enumeration e)
  {
    enumeration = e;
  }

  ...

class EnumerationIterator
  implements Iterator
{

  private final Enumeration enumeration;

  public EnumerationIterator(final Enumeration e)
  {
    enumeration = e;
  }

  ...

这些变化基本上意味着" IterableEnumeration可以与Enumeration任何子类型协作T."

推荐阅读
U友50081205_653
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有