我正在开发一个编写java文件的工具。在给定的点上,我必须编写一个数组声明。我已经实现了以下方法:
public static String arrayToCode(Long[] arr, String arrName) {
StringBuilder sb = new StringBuilder();
sb.append("Long[]" + arrName + " = { ");
for (int i = 0; i < arr.length; i++) {
sb.append(arr[i] + "L, ");
}
sb.append("};");
return sb.toString();
}
public static String arrayToCode(String[] arr, String arrName) {
StringBuilder sb = new StringBuilder();
sb.append("String[]" + arrName + " = { ");
for (int i = 0; i < arr.length; i++) {
sb.append(arr[i] + "L, ");
}
sb.append("};");
return sb.toString();
}
public static String arrayToCode(Double[] arr, String arrName) {
StringBuilder sb = new StringBuilder();
sb.append("Double[]" + arrName + " = { ");
for (int i = 0; i < arr.length; i++) {
sb.append(arr[i] + "L, ");
}
sb.append("};");
return sb.toString();
}
但是,我想为各种数组制作单一的泛型方法,问题是我不知道如何使用泛型来处理类型,即我怎么知道它是{{1} },Long
或String
数组?
答案 0 :(得分:6)
public static String arrayToCode(Object[] arr, String arrName) {
StringBuilder sb = new StringBuilder();
sb.append(arr.getClass().getComponentType() + "[]" + arrName + " = { ");
for (int i = 0; i < arr.length; i++) {
sb.append(arr[i] + "L, ");
}
sb.append("};");
return sb.toString();
}
答案 1 :(得分:1)
您可以接受Object[]
,然后使用getClass()
来确定它的真实类型。
public static String arrayToCode(Object[] arr, String arrName) {
String arrayTypeText = getArrayType(arr);
sb.append(arrayTypeText + " " + arrName + ...);
//...
}
private String getArrayType(Object[] arr) {
Class<?> clazz = arr.getClass();
if ( clazz == Double[].class ) {
return "Double[]";
} else if (...) {
}
}
getArrayType()
的替代实现可能是
private String getArrayType(Object[] arr) {
return arr.getClass().getComponentType().getSimpleName() + "[]";
}
如果你真的想要生成代码,你可能应该使用完全限定的名称,在这种情况下,你可以用getSimpleName()
替换上面的getName()
(它将返回java.lang.Long
,例如)
答案 2 :(得分:1)
Class有几个对象 - getName(),getCanonicalName()。不确定区别。
public class CodeGen {
public static String arrayToCode(Object[] arr, String arrName) {
StringBuilder sb = new StringBuilder();
sb.append(arr.getClass().getCanonicalName()+" " + arrName + " = { ");
for (int i = 0; i < arr.length; i++) {
sb.append(arr[i] + "L, ");
}
sb.append("};");
return sb.toString();
}
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
String[] foo = new String[] { "a","b","c" };
System.out.println(arrayToCode(foo, "foobar"));
}
}
答案 3 :(得分:1)
试试这个:
public class Foo
{
public static void main(String [] args)
{
System.out.println(
arrayToList(new Integer[] {1, 2 ,3}, "Foo")
);
}
public static <T> String arrayToList (T[] data, String name)
{
StringBuilder sb = new StringBuilder();
sb.append(data[0].getClass().getSimpleName() + "[]" + name + " = { ");
for (int i = 0; i < data.length; i++)
{
sb.append(data[i] + "L, ");
}
sb.append("};");
return sb.toString();
}
}