2017-04-01 273 views
4

我有一個Foo類延伸AbstractList並實現List。這個類實現了一些List方法,但有些只是拋出UnsupportedOperationException類必須聲明爲抽象或實現抽象方法toArray

toArray是後來之一,而編譯器不會抱怨其他沒有真正實現的方法,它抱怨的toArray錯誤:

Class must either be declared abstract or implement abstract method toArray(T[]) in List

public class Foo extends AbstractList implementst List { 
    ... 
    public <T> T[] toArray(T[] a) throws UnsupportedOperationException { 
     throw new UnsupportedOperationException(error); 
    } 
} 

這裏有什麼問題,爲什麼編譯器仍然認爲toArray(T[])方法未實現?

+0

'toArray'已經在'AbstractCollection'中實現了,'AbstractList'擴展了。 – xehpuk

回答

2

由於您使用的通用方法public T []指定者(T []一),你應該添加參數類簽名並使其延伸,分別實現參數化類和接口,而不是原始的。然後它將編譯:

public class Foo<T> extends AbstractList<T> implements List<T> { 

    @Override 
    public <E> E[] toArray(E[] a) throws UnsupportedOperationException { 
     throw new UnsupportedOperationException("Error!"); 
    } 

    ... 
} 
+1

OP的方法已經參數化。 – xehpuk

+0

同意。編輯答案。這樣就不會有隱藏的警告。 – Gyrotank

+0

@azurefrog我沒有解決你的問題。 – xehpuk

-1

此代碼編譯:

import java.util.AbstractList; 
import java.util.List; 

public class Foo extends AbstractList implements List { 

    @Override 
    public Object[] toArray(Object[] a) { 
     // TODO Auto-generated method stub 
     return null; 
    } 

    @Override 
    public Object get(int index) { 
     // TODO Auto-generated method stub 
     return null; 
    } 

    @Override 
    public int size() { 
     // TODO Auto-generated method stub 
     return 0; 
    } 
} 

如果使用java.util包。

+2

好吧,但爲什麼不' T [] toArray(T [] a)'? –

+0

因爲超類和子類中的參數類型不能不同。這裏是https://docs.oracle.com/javase/tutorial/java/generics/inheritance.html –

+0

我不確定那個鏈接的相關性 - 它只是說例如'SomeClass '不是'SomeClass '的子類型。 –

相關問題