有没有办法以一般方式测量物体的大小或长度?

时间:2015-07-29 13:56:35

标签: java generics size string-length

例如,对于String x,可以通过x.length()来衡量字符数 与ArrayList类似,使用.size()方法可以满足它的大小。

我想设置一个可以通过不同类型对象的for循环。

4 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:1)

  

我想设置一个可以通过不同类型对象的for循环。

如已经提到的,尺寸/长度可以具有不同的每种类型的含义,并且通常甚至对于一种类型而言取决于语义,例如,内存中的大小与字符串中的字符数等。

除了通过size / length + index循环遍历这些元素之外,因为使用该索引的方法也不同,例如, charAt(idx)表示字符串与get(idx)表示列表。索引的附加访问并不总是可行的,例如,套装。

除此之外,你可能会使用Iterable<T>来使用foreach循环,即使用隐式只读迭代器循环遍历所有元素。

这样的事情:

<T> void loop(Iterable<T> i) {
  for( T element : i ) {
    //whatever
  }
}

虽然这对于字符串开箱即可,因为你只能为它们获取原始数组,因此你需要一个能够翻译&#34;介于char[]Iterable<Character>之间。

答案 2 :(得分:0)

嗯,所有对象的长度/大小可能有不同的含义。对于List,size表示其中的元素数,String长度表示String中的字符数。两者虽然类似物不同。

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

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

答案 3 :(得分:0)

我认为没有一种简单的方法可以做到,但您可以尝试使用Java Reflection。

以下是一个示例:

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);
        }
    }
}

这是输出:

java.lang.String == 16

java.util.ArrayList == 3

无法处理类java.lang.Integer

有关Java反射的更多信息:https://docs.oracle.com/javase/tutorial/reflect/