【问题标题】:Comparing generic types Java比较泛型类型 Java
【发布时间】:2013-04-02 18:10:28
【问题描述】:

我在比较泛型类型时遇到了问题。在 C# 中,我总是这样做:class Element<T, V> where T : IComparable<T>

我的问题是如何用java编写?

【问题讨论】:

    标签: java generics types compare


    【解决方案1】:

    我怀疑你想要类似的东西:

    class Element<T extends Comparable<T>>
    

    ...使用Comparable 接口和bounded type parameter

    【讨论】:

    • ...为了帮助下一个人,您需要调用 .compareTo() (docs.oracle.com/javase/6/docs/api/java/lang/…) 而不是使用运算符。
    • 我很好奇为什么 Class 实现 Comparable 对于泛型类型不能正常工作,而 Class> 可以。你能提供一个解释吗?谢谢
    • @Mushy:不清楚你的意思——“不能正常工作”太含糊了。我怀疑你应该问一个非常具体的新问题。
    【解决方案2】:

    希望对其他人有所帮助。

    import java.lang.reflect.Method;
    import java.util.ArrayList;
    import java.util.Collections;
    import java.util.HashMap;
    import java.lang.reflect.Method;
    import java.util.ArrayList;
    import java.util.Collections;
    import java.util.HashMap;
    
    public class Comparator {
        public static HashMap<Class,Class> primitiveMap = new HashMap<Class,Class>() {{
            put(boolean.class,Boolean.class);
            put(byte.class,Byte.class);
            put(char.class,Character.class);
            put(short.class,Short.class);
            put(int.class,Integer.class);
            put(long.class,Long.class);
            put(float.class,Float.class);
            put(double.class,Double.class);
            put(String.class,String.class);
            put(Boolean.class,Boolean.class);
            put(Byte.class,Byte.class);
            put(Character.class,Character.class);
            put(Short.class,Short.class);
            put(Integer.class,Integer.class);
            put(Long.class,Long.class);
            put(Float.class,Float.class);
            put(Double.class,Double.class);
            put(Number.class, Number.class);
        }};
        
        private static int compare(Class<?> returnType,Object a, Object b) {
            if(returnType == String.class) {
                return ((String)a).compareTo((String)b);
            } else if(returnType == Short.class) {
                return ((Short)a).compareTo((Short)b);
            } else if(returnType == Integer.class) {
                return ((Integer)a).compareTo((Integer)b);
            } else if(returnType == Long.class) {
                return ((Long)a).compareTo((Long)b);
            } else if(returnType == Float.class) {
                return ((Float)a).compareTo((Float)b);
            } else if(returnType == Double.class) {
                return ((Double)a).compareTo((Double)b);
            }
            return 0;
        }
        public static <T> void sortAscending(ArrayList<T> list,Method m) {
            Class<?> returnType = primitiveMap.get(m.getReturnType());
            Collections.sort(list,(a,b) -> {
                try {
                    return compare(returnType,m.invoke(a),m.invoke(b));
                } catch(Exception e) {
                    System.out.println("Exception occured"+e.getMessage());
                }
                return 0;
            });
        }
        public static <T> void sortDescending(ArrayList<T> list,Method m) {
            Class<?> returnType = primitiveMap.get(m.getReturnType());
            Collections.sort(list,(a,b) -> {
                try {
                    return compare(returnType,m.invoke(b),m.invoke(a));
                } catch(Exception e) {
                    System.out.println("Exception occured"+e.getMessage());
                }
                return 0;
            });
        }
    }
    
    

    用于

    
    import java.util.ArrayList;
    
    public class Roommates {
        private String name;
        private int age;
        public Roommates(String name,int age) {
            this.name=name;
            this.age=age;
        }
        public String getName() {
            return name;
        }
        public int getAge() {
            return age;
        }
        public String toString() {
            return "name="+name+" age="+age;
        }
        
        public static void main(String...strings)throws Exception {
            ArrayList<Roommates> list = new ArrayList<Roommates>();
            list.add(new Roommates("Siva",31));
            list.add(new Roommates("Prabu",25));
            list.add(new Roommates("Suresh",55));
            list.add(new Roommates("Raghav",23));
            list.add(new Roommates("Suganthan",27));
            list.add(new Roommates("Vijay",34));
            
            Comparator.sortDescending(list,Roommates.class.getDeclaredMethod("getName"));
            System.out.println(list);
            
            Comparator.sortAscending(list,Roommates.class.getDeclaredMethod("getAge"));
            System.out.println(list);
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-27
      • 1970-01-01
      • 1970-01-01
      • 2015-01-31
      • 2012-11-16
      • 2010-12-29
      相关资源
      最近更新 更多