重载和覆盖泛型方法 - java

问题描述 投票:2回答:1

我正在修改一些java考试,通过一些过去的论文,我对这个问题使用方法重载完全感到困惑。

问题是:

请考虑以下Java接口。

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

(a)在接口Converter中编写一个默认方法convertAll,它将ArrayList xs作为输入并返回一个新的ArrayList。如果ArrayList xs是[x1,...,xn],则该方法返回[convert(x1),...,convert(xn)]。在您的方法中,您可以假设xs永远不为空。如果其中一个转换调用抛出异常,则您的方法不应该捕获它。

(b)编写一个适当实现上述接口的StringConverter类。特别是,该类应该有一个方法public Integer convert(String word),其行为如下:

•如果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;
    }
}

string converter.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()方法调用StringConverter.java中的其他convert()方法并实际执行转换。我要么开始一个无限的递归循环,要么得到一个模糊的方法调用警告。这不是作业,只是修改。任何帮助让我理解这一点将不胜感激。

java generics override overloading
1个回答
3
投票

你需要做的是实现这样的界面:


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

然后你的方法可以像这样重写:

@Override
public Integer convert(String word) {
    if (word == null)
        throw new IllegalArgumentException();
    return word.length();
}
© www.soinside.com 2019 - 2024. All rights reserved.