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>
这两个陈述之间有什么区别?在代码中,两者都适合我。
答案 0 :(得分:3)
我们在声明它时是否使该类具有通用性,因为我只在方法中使用这种通用的东西,或者我们在这里基本上做了什么?
是的,像这样定义的类是通用的,其类型参数称为Integer
和String
。但是,这些不类型java.lang.Integer
和java.lang.String
- 参数定义为 shadowing 实际类型java.lang.Integer
和java.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
的新类型变量,这些变量与真实Integer
和String
类型没有实际关系。这与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>
两者都是一样的。