我正在尝试创建一个名为“ sub”的方法,该方法在将String作为第一个参数传递时返回一个子字符串,而在将数组作为第一个参数传递时返回一个子数组。例如:

sub("hello", 1, 3)返回"el"

sub(new String[]{"a","b","c","d"}, 1, 3)返回包含{"b","c"}的String数组

sub(new Integer[]{1,2,3,4}, 0, 2)返回一个包含{1,2}的Integer数组

我有String部分可以工作,但是我无法弄清楚数组部分。到目前为止,这是我的代码(我假设开始索引和结束索引是有效的):

public static <T extends Object> T sub(T obj, int start, int end){
        if(obj instanceof String){
            return ((T) (((String) obj).substring(start, end)));
        }
        else if(obj != null && obj.getClass().isArray()){
            return (???)
        }
        else return null;
    }


我想使用Arrays.copyOfRange()创建子数组,但是我创建它的方式并不重要。

这是我尝试代替return (???)语句的所有操作:

return Arrays.copyOfRange(obj, start, end);
return (T) Arrays.copyOfRange(obj, start, end);
return (T) Arrays.copyOfRange(obj, start, end, T);


任何帮助,将不胜感激。我对使用泛型非常陌生,因此,如果无法使用泛型,我感到很抱歉。如果您在我的代码中发现任何其他缺陷,请随时指出。谢谢!

最佳答案

可以使用以下版本,但我不太相信这是最好的方法,但现在可能会对您有所帮助,或者其他人可以采用它来进行改进:

private static <T> T sub(T obj, int start, int end) {
    if (obj instanceof String) {
        String v = (String) obj;
        return (T) v.substring(start, end);
    } else if (obj != null && obj.getClass().isArray()) {
        Object[] v = (Object[]) obj;
        return (T) Arrays.copyOfRange(v, start, end);
    } else {
        return null;
    }
}


public static void main(String[] args) {
    System.out.println(sub("hello", 1, 3));                                          // el
    System.out.println(Arrays.toString(sub(new String[]{"a", "b", "c", "d"}, 1, 3)));//[b,c]
    System.out.println(Arrays.toString(sub(new Integer[]{1, 2, 3, 4}, 0, 2)));       //[1,2]
}

07-24 09:49
查看更多