如何在Java中使用<T extends KeyedItem<KT>, KT extends Comparable<? super KT>>泛型创建对象?
如何创建带泛型约束的MyBinarySearchTreePlus对象
没问题,我来一步步给你拆解怎么搞定这个泛型对象的创建。首先得明确你的泛型约束:T必须继承KeyedItem<KT>,而KT得是可比较的(extends Comparable<? super KT>)。下面是具体的步骤和示例:
1. 先准备符合约束的实体类
首先你需要一个实现了KeyedItem<KT>的类作为T,同时KT得满足可比较的要求。
假设KeyedItem是一个接口(根据你的类结构推测),先定义它:
public interface KeyedItem<KT> { KT getKey(); // 这个方法应该是KeyedItem的核心,用来获取键 }
接下来创建一个具体的T类,比如Employee,用Integer作为键(Integer本身就实现了Comparable<Integer>,完美符合KT的约束):
public class Employee implements KeyedItem<Integer> { private Integer employeeId; private String name; public Employee(Integer employeeId, String name) { this.employeeId = employeeId; this.name = name; } @Override public Integer getKey() { return employeeId; } // 可选:重写toString方便测试查看内容 @Override public String toString() { return "Employee{id=" + employeeId + ", name='" + name + "'}"; } }
如果你想用自定义的KT类型,比如自己的UserId类,那这个类必须实现Comparable接口,比如:
public class UserId implements Comparable<UserId> { private long value; public UserId(long value) { this.value = value; } @Override public int compareTo(UserId other) { return Long.compare(this.value, other.value); } } // 对应的T类 public class User implements KeyedItem<UserId> { private UserId userId; private String username; public User(UserId userId, String username) { this.userId = userId; this.username = username; } @Override public UserId getKey() { return userId; } }
2. 创建MyBinarySearchTreePlus对象
现在就可以创建树的实例了,有几种写法:
显式指定类型参数(最清晰)
// 用Employee和Integer作为类型参数 MyBinarySearchTreePlus<Employee, Integer> empTree = new MyBinarySearchTreePlus<>();
Java 7及以上支持菱形运算符<>,右边的类型参数可以省略,编译器会自动推断。如果你用的是更早的版本,就得写全:
MyBinarySearchTreePlus<Employee, Integer> empTree = new MyBinarySearchTreePlus<Employee, Integer>();
用var简化(Java 10+)
如果你用的是Java 10或更高版本,可以用var让编译器自动推断变量类型:
var empTree = new MyBinarySearchTreePlus<Employee, Integer>();
自定义KT类型的实例创建
如果用前面的User和UserId,写法是一样的:
MyBinarySearchTreePlus<User, UserId> userTree = new MyBinarySearchTreePlus<>();
关键注意点
- 一定要保证
T确实实现/继承了KeyedItem<KT>,否则编译器会报错 KT必须实现Comparable<? super KT>——通常直接实现Comparable<KT>就足够了,因为KT本身就是自己的super类型(满足? super KT的要求)
内容的提问来源于stack exchange,提问作者Mike Naples
相关产品推荐
相关产品推荐

