【问题标题】:overloading an overriden generic method - java重载和覆盖泛型方法 - java
【发布时间】:2019-04-26 23:42:27
【问题描述】:

我正在通过一些过去的论文来复习 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 永远不会为空。如果对 convert 的调用之一引发异常,则您的方法不应捕获它。

(b) 编写一个适当地实现上述接口的类 StringConverter。特别是,该类应该有一个方法 公共整数转换(字符串字) 其行为如下:

• 如果 word 是空引用,则抛出 IllegalArgumentException。

• 否则该方法返回单词的长度。

这是我所做的:

转换器.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() 方法来调用 StringConverter.java 中的另一个 convert() 方法并实际进行转换。我要么启动一个无限递归循环,要么得到一个模棱两可的方法调用警告。这不是作业,只是复习。任何帮助我理解这一点将不胜感激。

【问题讨论】:

    标签: java generics overriding overloading


    【解决方案1】:

    你需要做的是实现这样的接口:

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

    然后你的方法可以像这样被覆盖:

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

    【讨论】:

    • 我认为您不需要将类型作为参数传递给您的 StringConverter 类,请尝试删除它
    • 太棒了!它现在工作谢谢!我认为如果你想实现一个通用接口,你也必须给类参数化类型,但显然不是,这很好用。干杯
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-17
    相关资源
    最近更新 更多