核心java关于泛型和集合

时间:2015-08-20 19:34:47

标签: java generics collections hashmap

class ByValue<String, Integer extends Comparable<Integer>> implements Comparator<Map.Entry<String, Integer>> {
        public int compare(Map.Entry<String, Integer> o1, Map.Entry<String, Integer> o2) {
            return o1.getValue().compareTo(o2.getValue());
        }
    }

这是按值排序map的代码,这段代码运行正常,但我对这里使用的基本java技术和语法有一些疑问,

首先,我无法理解class ByValue<String, Integer extends Comparable<Integer>>。我们在声明它时是否使该类具有通用性,因为我只在方法中使用这种通用的东西,或者我们在这里基本上做了什么?

第二件事是我可以使用Map.Entry<String, Integer>Entry<String, Integer>这两个陈述之间有什么区别?在代码中,两者都适合我。

3 个答案:

答案 0 :(得分:3)

  

我们在声明它时是否使该类具有通用性,因为我只在方法中使用这种通用的东西,或者我们在这里基本上做了什么?

是的,像这样定义的类是通用的,其类型参数称为IntegerString。但是,这些类型java.lang.Integerjava.lang.String - 参数定义为 shadowing 实际类型java.lang.Integerjava.lang.String,所以我建议你遵循用一个大写字母命名类型参数的众所周知的方法:

class ByValue<T, U extends Comparable<Integer>> implements Comparator<Map.Entry<T, U>> {
    public int compare(Map.Entry<T, U> o1, Map.Entry<T, U> o2) {
        return o1.getValue().compareTo(o2.getValue());
    }
}

这样,你可以注意到,你的(通用)类没有实现Comparator<Map.Entry<String, Integer>>。如果你真的需要它,实际上不需要该类是通用的,而只是实现Comparator接口,用特定的类型参数化:

class ByValue implements Comparator<Map.Entry<String, Integer>> {
    public int compare(Map.Entry<String, Integer> o1, Map.Entry<String, Integer> o2) {
        return o1.getValue().compareTo(o2.getValue());
    }
}
  

第二件事是我可以使用Map.Entry或Entry这两个语句之间有什么区别?

没有实际差异。如果您有import这样的声明:

import java.util.Map.Entry;

然后你可以使用Entry,而不指出它定义的类(在这种情况下为Map)。

答案 1 :(得分:2)

{a: x, b: y, c: z}
  

我们在声明它时是否使该类具有通用性,因为我只在方法中使用这种通用的东西,或者我们在这里基本上做了什么?

你在这里做的事实上是把一切都搞糟了。现在,您正在制作名为class ByValue<String, Integer extends Comparable<Integer>> implements Comparator<Map.Entry<String, Integer>> String的新类型变量,这些变量与真实IntegerString类型没有实际关系。这与Integer基本相同,只是类型变量名为class ByValue<K, V extends Comparable<V>> implements Comparable<Map.Entry<K, V>>String,这非常令人困惑。

相反,它应该只是

Integer
  

第二件事是我可以使用Map.Entry或Entry这两个语句之间有什么区别?在代码中,两者都适合我。

没有区别。它只是两种引用相同类型的方式。

答案 2 :(得分:1)

  

第二件事是我可以使用Map.Entry或Entry这两个语句之间有什么区别?在代码中,两者都适合我。

在接口OrderedDict([('foo', 'bar'), ('a_list', [1, 2, 3]), ('another_object', OrderedDict([('c', 3), ('a', 1), ('b', 2)])), ('last_key', 42)]) 的声明中声明了接口java.util.Map。您可以拥有以下任一项:

Entry

或者你可以

import java.util.Map;

Map.Entry<String, Integer>

两者都是一样的。