我正在尝试创建一个名为“ 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]
}