泛型:返回类型错误

时间:2018-04-05 11:39:01

标签: java generics methods

当我尝试编译我的文件时,我遇到了这些错误:

  

无效的方法声明;需要返回类型     public get(int i)throws SortingException {

     

无效的方法声明;需要返回类型     public set(int i,T elem)抛出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);
  }

4 个答案:

答案 0 :(得分:1)

您需要声明方法的返回类型。

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);
    }
}

答案 1 :(得分:1)

<T>删除尖括号:

public T set(...) // return type is the instance’s type for T
public T get(...) 

您使用的语法public <T> set 键入类型为T的方法,该方法模糊了类的类型,通常用于声明随着调用而变化,即public <T> T set(...)将返回一个类型,该类型依赖于如何调用该方法(例如,可以推断出类型)并且该类型将没有任何内容与调用它的实例的泛型类型有关。

答案 2 :(得分:0)

使用返回类型

public <T> T set(...)

答案 3 :(得分:0)

当你宣布:

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{ 
      ...
    }

}