为什么Collections.binarySearch()使用这个可比较的?
我有这个实现Comparable
接口的Player
类。 然后我有一个Player
的ArrayList
。 我正在尝试在Player
的列表中使用binarySearch()
来查找一个Player
,但是Java给了我一个“ cannot find symbol: method binarySearch(java.util.ArrayList,Player)
”。
这个Player类:
class Player implements Comparable { private String username; private String password; Statistics stats; //Constructor, creates a new Player with a supplied username Player(String name) { username = name; password = ""; stats = new Statistics(); } //Accessor method to return the username as a String String getName() { return username; } String getPassword() { return password; } void setPassword(String newPass) { password = newPass; } //Method to change the username void setName(String newName) { username = newName; } public int compareTo(Object o) { return username.compareTo(((Player)o).username); } }
奇怪的是,当我在同一个列表上尝试Collections.sort()时,它可以工作。
使用不一致地使用generics。 注意编译器警告。 始终提供通用参数(或从不提供它们)。
代替:
class Player implements Comparable { [...] public int compareTo(Object o) {
使用
class Player implements Comparable { [...] public int compareTo(Player o) {
仿制药的规则很难,没有稀有类型的复杂性。 因此,如果你混淆它们,通常会放弃语言规范。
只要您实现Comparable ,您可以通过重写equals()
和hashCode()
使compareTo()
与equals()
保持一致。 在这种情况下,这非常简单,因为您可以简单地委托给String
。 此外,如果您需要包含Player
实例的Map
,这很方便:
class Player implements Comparable { private String username; private String password; // ... @Override public int compareTo(String name) { return username.compareTo(name); } @Override public boolean equals(Object obj) { return obj instanceof Player && username.equals(((Player)obj).username); } @Override public int hashCode() { return username.hashCode(); } }
- List <List >是Collection <Collection >的实例吗?
- 如何获得参数化的Class实例
- 在Java 1.5中将非genericsList类型转换为Generic List类型
- Java将“.class”-operator用于generics类型,例如List,“Class <List >”和“Class <List >”
- 如何构造ConstraintViolationException?
- 理解此警告:可序列化类不声明静态最终serialVersionUID
- Gson:解析generics集合
- 带有ArrayList的Java Generic 添加元素
- Javagenerics方法:超级不能用?