перегрузка переопределенного универсального метода - Java - PullRequest
2 голосов
/ 27 апреля 2019

Я готовлюсь к экзамену по Java, просматривая некоторые прошлые статьи, и полностью озадачен этим вопросом, использующим перегрузку методов.

Вопрос:

Рассмотрим следующий интерфейс Java.

public interface Converter<A, B> { 
    B convert(A xs); 
}

(a) Написать метод по умолчанию convertAll в конвертере интерфейса, который принимает ArrayList xs в качестве входных данных и возвращает новый ArrayList. Если ArrayList xs равен [x1, ..., xn], метод возвращает [convert (x1), ..., convert (xn)]. В вашем методе вы можете предположить, что xs никогда не является нулевым. Если один из вызовов преобразований выдает исключение, ваш метод не должен его перехватывать.

(b) Написать класс StringConverter, который соответствующим образом реализует вышеуказанный интерфейс. В частности, класс должен иметь метод public Integer convert (String word) который ведет себя следующим образом:

• Если слово является пустой ссылкой, генерируется исключение IllegalArgumentException.

• В противном случае метод возвращает длину слова.

Вот что я сделал:

Converter.java

package com.sp2.bbk.q4;

import java.util.ArrayList;

public interface Converter<A, B> {

    B convert(A xs);

    default ArrayList<B> convertAll(ArrayList<A> xs) {
        ArrayList<B> newArrayList = new ArrayList<>();
        for (A a : xs) {
            newArrayList.add(convert(a));
        }
        return newArrayList;
    }
}

StringConverter.java

package com.sp2.bbk.q4;

import java.util.ArrayList;

public class StringConverter<A, B> implements Converter<A, B> {

    private ArrayList<A> stringList;

    public StringConverter() {
        this.stringList = new ArrayList<>();
    }

    public ArrayList<A> getStringList() {
        return stringList;
    }

    public Integer convert(String word) {
        if (word == null)
            throw new IllegalArgumentException();
        return word.length();
    }

    @Override
    public B convert(A xs) {
        // what happens here??
    }
}

Main.java

package com.sp2.bbk;

import com.sp2.bbk.q4.StringConverter;

import java.util.ArrayList;

public class Main {

    public static void main(String[] args) {

        // Question 4
        StringConverter<String, Integer> stringConverter = new StringConverter<>();
        stringConverter.getStringList().add("This");
        stringConverter.getStringList().add("is");
        stringConverter.getStringList().add("a");
        stringConverter.getStringList().add("sentence");

        ArrayList<Integer> convertedList = stringConverter.convertAll(stringConverter.getStringList());
        System.out.println(convertedList);
    }
}

Кажется достаточно простым, метод convertAll () преобразует все слова в целое число, представляющее длину каждого слова, путем вызова метода convert () и сохранения результата в списке.

Я не могу понять, как использовать реализованный метод convert () для вызова другого метода convert () в StringConverter.java и фактически выполнить преобразование. Я либо запускаю бесконечный рекурсивный цикл, либо получаю неоднозначное предупреждение о вызове метода. Это не домашнее задание, просто ревизия. Любая помощь, которая поможет мне понять это, будет принята с благодарностью.

1 Ответ

3 голосов
/ 27 апреля 2019

Что вам нужно сделать, это реализовать такой интерфейс:


public class StringConverter implements Converter<String, Integer> { 
    //...
}

Тогда ваш метод можно переопределить так:

@Override
public Integer convert(String word) {
    if (word == null)
        throw new IllegalArgumentException();
    return word.length();
}
...