Generics: ошибка типа возвращаемого значения

когда я пытаюсь скомпилировать свой файл, я получаю следующие ошибки:

invalid method declaration; return type required public get(int i) throws SortingException{

invalid method declaration; return type required public set(int i, T elem) throws 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);
  }
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
0
437
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Ответ принят как подходящий

Вам необходимо объявить возвращаемый тип для ваших методов.

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);
    }
}
set, вероятно, также возвращает T.
lexicore 05.04.2018 13:45

Почти наверняка нет OP намерен ввести методы, но ваш ответ предполагает это.

Bohemian 05.04.2018 13:47

@Bohemian, вы, вероятно, правы, но именно это OP сделал в начальной версии. Я отредактировал ответ, включив второй вариант. Весь класс немного странный, так как он также включает статический метод InsertSort, которому, похоже, он не принадлежит.

Diasiare 05.04.2018 13:48

Снять угловые скобки с <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{ 
      ...
    }

}

Другие вопросы по теме