Java:如何将 Arrays.copyOfRange() 与泛型类型一起使用?

标签 java arrays generics

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

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

sub(new String[]{"a","b","c","d"}, 1, 3) 返回一个包含 {"b"的字符串数组,“c”}

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

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

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]
}

关于Java:如何将 Arrays.copyOfRange() 与泛型类型一起使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57450365/

相关文章:

java - Gradle编译Java失败sun.net.www.protocol.http.ntlm.NTLMAuthenticationCallback

带有结构体和二维数组的 C 指针

java - 将集合过滤为指定类型会生成编译器警告

c# - 从 Java 迁移到 C#

java - 如何使用 Java 在 MongoDB 3 中使用多个过滤器执行文档的批量更新

C - 将数字插入数组并保持排序顺序

javascript - 如何将键值对映射到对象中的每个索引

c# - 我可以将容器类方法与通用接口(interface)的方法集成吗?

Java 泛型 - 方法签名的上限

java - 在构造函数中使用 "this instanceof …"或 "getClass()"是否安全?