3

次のコンパイルエラーは私には意味がありません。誰かが解明できることを望んでいました:

static public void main(String args[]) throws ZipException, IOException
{
    File file = new File("C:\\temp");
    ZipFile zip_file = new ZipFile(file);
    Enumeration<ZipEntry> entries = zip_file.entries();
}   

次のエラーが表示されます。Type mismatch: cannot convert from Enumeration<capture#1-of ? extends ZipEntry> to Enumeration<ZipEntry>

上記のコードをコンパイルするには、entries宣言をジェネリックを使用するように置き換える必要がありました<? extends ZipEntry>。なぜ私はこれをしなければならないのですか?ZipEntry は ZipEntry を拡張していませんか? (それは空虚な真実ではありませんか?)なぜコンパイラはそれについて不平を言うのですか?

それが役立つ場合、Eclipse Indigo 64 ビットで Java 7.03 を使用しています。

4

4 に答える 4

5

ZipFile.entries()拡張ZipEntry型の列挙を返しますが、それ自体に限定されないZipEntryため、次を使用する必要があります。

Enumeration<? extends ZipEntry> entries = zip_file.entries();

JarEntryこれにより、オブジェクトなどの他のタイプをZipEntry列挙で使用できます。

于 2012-10-26T23:51:28.353 に答える
2

よく見ると(ソースコード)、以下のようにしか返さEnumeration<ZipEntry>れません:

     return new Enumeration<ZipEntry>() {
            private int i = 0;
            public boolean hasMoreElements() {
            .....
            .....

ただし、戻り値の型の制限public Enumeration<? extends ZipEntry> entries() {緩和するために戻り値の型を宣言しています。entries()のカスタム サブクラスを介してメソッドをオーバーライドする場合は、同じメソッドからの戻り値の型としてのサブクラスの 1 つZipfileを使用することができます。ZipEntryZipEntry

ジェネリックを使用したくない場合は、次のように記述できます。

  @SuppressWarnings("rawtypes")
  Enumeration entries = zip_file.entries();
于 2012-10-27T00:10:51.123 に答える
1
Make sure that the file exists and is accessible, you can also try this 

Enumeration<ZipEntry> entries = (Enumeration<ZipEntry>) zip_file.entries(); 
于 2012-10-27T00:03:43.383 に答える
1

メソッド内のすべてのインスタンスを使用<Z extends ZipEntry>して置き換え?ます (存在する場合) Z。に限定されませんZ。お好きな文字を使用できます。

于 2012-10-27T00:04:21.853 に答える