![](/img/trans.png)
[英]Generics type return type error: required type T, provided MyObject
[英]Generics: return type error
當我嘗試編譯文件時,出現以下錯誤:
方法聲明無效; 返回類型要求public get(int i)拋出SortingException {
方法聲明無效; 返回類型為必需的公共集(int i,Tlem)拋出SortingException {
這是我的方法:
public static <T extends Comparable<T>> ArrayList<T> insertionSort(ArrayList<T> list, int ordinamento){
ArrayList<T> listaOrdenada;
listaOrdenada = new ArrayList<T>(list);
for(int x = 1 ; x < listaOrdenada.size(); x++){
T aux = listaOrdenada.get(x);
int y = x - 1;
while(y >= 0 && aux.compareTo(listaOrdenada.get(y)) < 0){
listaOrdenada.set(y + 1, listaOrdenada.get(y));
y--;
}
listaOrdenada.set(y + 1, aux);
}
return listaOrdenada;
}
public <T> set(int i, T elem) throws SortingException {
if(i<0 || i>=(this.array).size()) throw new SortingException("ERRORE!");
return (this.array).set(i, elem);
}
public <T> get(int i) throws SortingException{
if(i<0 || i>=(this.array).size()) throw new SortingException("ERRORE!");
return (this.array).get(i);
}
您需要為方法聲明一個返回類型。
public <T> void set(int i, T elem) throws SortingException {
if(i<0 || i>=(this.array).size()) throw new SortingException("ERRORE!");
return (this.array).set(i, elem);
}
public <T> T get(int i) throws SortingException{
if(i<0 || i>=(this.array).size()) throw new SortingException("ERRORE!");
return (this.array).get(i);
}
請注意,這假定您的泛型類型應在方法級別上進行綁定。 這似乎更有可能在類級別完成,在這種情況下,您應該有類似的東西。
public class YourClassName <T extends Comparable<T>> {
//Other methods and constructors goes here
public void set(int i, T elem) throws SortingException {
if(i<0 || i>=(this.array).size()) throw new SortingException("ERRORE!");
return (this.array).set(i, elem);
}
public T get(int i) throws SortingException{
if(i<0 || i>=(this.array).size()) throw new SortingException("ERRORE!");
return (this.array).get(i);
}
}
從<T>
除去尖括號:
public T set(...) // return type is the instance’s type for T
public T get(...)
您使用public <T> set
語法所鍵入的方法的類型T
遮蓋了類的類型,通常用於聲明隨調用而變化的返回類型,即public <T> T set(...)
將返回一個類型,它是依賴於如何調用該方法(例如,類型可以推斷)和類型將有無關的泛型類型上,它被稱為實例。
使用退貨類型
public <T> T set(...)
如您聲明:
public <T> set(int i, T elem) throws SortingException {...}
您聲明了作用域方法類型T
它沒有定義任何返回類型。
因此,這是一個編譯錯誤。
雖然以下內容將作用域方法類型T
和此T
都聲明為返回類型:
public <T> T set(int i, T elem) throws SortingException {...}
但是,定義作用域方法類型可能不是解決問題的正確方法。
您沒有顯示整個類,但是定義范圍方法泛型很可能不是一個好主意,因為類應由類持有,因為這些泛型方法很可能與相同的泛型一起工作。
只需刪除方法聲明中的<T>
並返回T
,即類通用:
public class MyClass<T>{
public static ArrayList<T> insertionSort(ArrayList<T> list, int ordinamento){
...
}
public void set(int i, T elem) throws SortingException {
...
}
public T get(int i) throws SortingException{
...
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.