You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 09:50:26