Java 有没有一种方法可以用一般方法测量物体的大小或长度?

Java 有没有一种方法可以用一般方法测量物体的大小或长度?,java,generics,size,string-length,Java,Generics,Size,String Length,例如,使用String x,可以通过x.length() 与ArrayList类似,它的大小可以通过.size()方法满足 我想设置一个for循环,可以遍历不同类型的对象 可能吗?当然当然,测试各种可能性的巨大if块将是最基本(也是最丑陋)的想法。另一种方法是使用反射并查找size()方法。也不是很漂亮 不幸的是(对您来说),这些类没有共享一个公共接口,因为sice()方法在每个类中都有非常不同的含义。好吧,所有对象的长度/大小可能都有不同的含义。对于列表,大小表示其中的元素数,字符串长度表示字

例如,使用
String x
,可以通过
x.length()
与ArrayList类似,它的大小可以通过
.size()
方法满足


我想设置一个for循环,可以遍历不同类型的对象

可能吗?当然当然,测试各种可能性的巨大if块将是最基本(也是最丑陋)的想法。另一种方法是使用反射并查找
size()
方法。也不是很漂亮


不幸的是(对您来说),这些类没有共享一个公共接口,因为
sice()
方法在每个类中都有非常不同的含义。

好吧,所有对象的长度/大小可能都有不同的含义。对于列表,大小表示其中的元素数,字符串长度表示字符串中的字符数。虽然两种类似物是不同的

因此,没有这样的通用方法。尺寸/长度在不同情况下可能有不同的含义

您可能需要定义一个公共接口,该接口由所有所需的类扩展,并在每个子类中定义此类方法

我想设置一个for循环,可以遍历不同类型的对象

如前所述,大小/长度可能对每种类型有不同的含义,通常甚至对一种类型也有不同的含义,具体取决于语义,例如内存中的大小与字符串中的字符数等

此外,通过size/length+索引在这些元素上循环将是困难的,因为使用该索引的方法也不同,例如字符串的
charAt(idx)
与列表的
get(idx)
。并非总是可以通过索引进行额外访问,例如,对于集合

除此之外,您可能需要使用
Iterable
,这将允许您使用foreach循环,即使用隐式只读迭代器在所有元素上循环

大概是这样的:

<T> void loop(Iterable<T> i) {
  for( T element : i ) {
    //whatever
  }
}
void循环(Iterable i){
对于(T元素:i){
//随便
}
}

但是,对于字符串来说,这不是现成的,因为您只能为它们获取基本数组,因此需要一个包装器,它可以在
char[]
Iterable
之间进行“转换”,我认为没有简单的方法,但您可以尝试Java反射

以下是一个示例:

public static void main(String[] args) {

    // Sample input
    List<Object> inputList = new ArrayList<Object>();
    inputList.add("This is a String");
    List<String> tmp = new ArrayList<String>();
    tmp.add("A");
    tmp.add("B");
    tmp.add("C");
    inputList.add(tmp);
    inputList.add(new Integer(0));

    // Create a map that hold the Class to Method relationship
    Map<String, String> classMethodPairs = new HashMap<String, String>();
    classMethodPairs.put("java.lang.String", "length");
    classMethodPairs.put("java.util.ArrayList", "size");
    // ... Add other class and method you like to use in the loop

    // Go through the list of input objects
    for (int i = 0; i < inputList.size(); i++) {

        Object aObj = inputList.get(i);

        // Find out the class name of the object
        String aObjClassName = aObj.getClass().getName();

        // Find out the method corresponding to the class from the map
        String sizeMethodName = classMethodPairs.get(aObjClassName);

        if (sizeMethodName != null) {

            try {

                // Get the method object
                Method sizeMethod = aObj.getClass().getMethod(sizeMethodName);

                // Use the method object to get the size
                System.out.println(aObjClassName + " == " + sizeMethod.invoke(aObj));                   

            } catch (NoSuchMethodException | SecurityException | IllegalAccessException | IllegalArgumentException | InvocationTargetException e) {

                System.err.println("Class " + aObjClassName + " does not has method " + sizeMethodName);
            } 

        } else {
            System.err.println("Unable to handle class " + aObjClassName);
        }
    }
}
publicstaticvoidmain(字符串[]args){
//样本输入
List inputList=新建ArrayList();
add(“这是一个字符串”);
List tmp=new ArrayList();
tmp.添加(“A”);
tmp.添加(“B”);
tmp.添加(“C”);
输入列表。添加(tmp);
添加(新整数(0));
//创建一个包含类到方法关系的映射
Map classMethodPairs=新HashMap();
classMethodPairs.put(“java.lang.String”,“length”);
put(“java.util.ArrayList”,“size”);
//…添加您希望在循环中使用的其他类和方法
//浏览输入对象列表
对于(int i=0;i
以下是输出:

java.lang.String==16

java.util.ArrayList==3

无法处理类java.lang.Integer


关于Java反射的更多信息:

以同样的方式处理字符串和集合似乎没有多大意义。它们只是在想要获得object@sysoDOTspace你说的尺寸是什么意思?以字节为单位的大小、以元素为单位的大小、使用的内存、序列化时的大小?