Java泛型中的? super T语法

本文深入解析了superT语法在Java中的应用,特别是泛型类的限制条件及其在泛型比较中的作用。通过具体实例展示了如何使用superT语法来增强代码的灵活性与安全性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

? super T 语法将泛型类限制为所有T的超类(包括T自身),但只能用于参数中,不可以在返回值用加以限定。
如果不加以限定,假设某个函数头为
? super Manager get()
由于编译器不知道该方法究竟会返回什么类,这样就只能用Object类来接收了。

该语法常用的一个情况是泛型类的比较
java.util.TreeSet<E> 代表一个有序的元素为E的树,它其中的一个构造器需要一个Comparator类来比较两个元素,以E为String类时为例,此时的Comparator可以是Comparator<String>,也可以是Comparator<Object>,但Comparator<Integer>就不行,如何表示这样的限制呢?
jdk源代码中是这样的:
public TreeSet(Comparator<? super E> c)
这样就保证了传给构造器的Comparator是可以进行E元素的比较的。

另一个例子,java.util.Collections的max方法用于获得一个容器中的最大值,这个函数头可以这样写:
public static <T extends Comparable<T>>  T max(Collection<T> coll)

这样就限定T为能和自己比较的类,过于严格,jdk源码是这样的:

public static <extends Object & Comparable<? super T>> T max(Collection<? extends T> coll) {
    Iterator
<? extends T> i = coll.iterator();
    T candidate 
= i.next();

    
while(i.hasNext()) {
    T next 
= i.next();
    
if (next.compareTo(candidate) > 0)
        candidate 
= next;
    }

    
return candidate;
}

很严谨的函数头,但是限定方面比较宽

### 回答1: Java中的extend和super是用于限制参数的关键字。 extend用于限制参数的上界,表示参数必须是指定类的子类或实现类。例如,List<? extends Number>表示参数必须是Number类或其子类。 super用于限制参数的下界,表示参数必须是指定类的父类或超类。例如,List<? super Integer>表示参数必须是Integer类或其父类。 使用extend和super可以使参数更加灵活,可以适应不同的场景需求。但是需要注意的是,使用过多的extend和super可能会导致代码可读性降低,因此需要根据实际情况进行选择和使用。 ### 回答2: Java中可以通过实现更强大的类安全和代码的复用性。在使用时,我们常常需要了解的extend和super关键字,以便更好地理解和使用。 的extend关键字 的extend关键字用于限定参数的上限,表示参数必须是继承了某个类或实现了某个接口才能被使用。例如: ``` public class GenericClass<T extends Number> { private T data; public GenericClass(T data) { this.data = data; } public T getData() { return data; } } ``` 在上面的类中,使用了T extends Number语法,表示参数T必须是继承了Number类的某个子类,否则编译会报错。这样可以保证data属性的类一定是Number或其子类类super关键字 super关键字用于限定参数的下限,表示参数必须是某个类的父类或某个接口的实现类。例如: ``` public class GenericClass<T super Number> { private T data; public GenericClass(T data) { this.data = data; } public T getData() { return data; } } ``` 在上面的类中,使用了T super Number语法,表示参数T必须是Number类的父类,即可以是Number类本身或其父类类。这样可以保证data属性的类一定是Number类或其父类类。 需要注意的是,的extend和super关键字只能用于参数,而不能用于普通类。在实际使用中,我们需要根据具体的情况来灵活地使用的extend和super关键字,以便在代码中实现更好的类安全和更高的代码复用性。 ### 回答3: Java中的是一种非常强大的语言特性,允许我们使用一种类来表示多种类,在编写类安全且可重用的代码时经常用到。在的使用中,我们有时需要约束所能使用的,使得代码更加类安全。在这种情况下,我们可以使用的 extend 和 super 关键字。 在 Java 中,使用 extends 关键字可以为参数添加上限限制。通过 extends 关键字,我们可以指定参数必须是某个类或接口的子类。这样做的好处是能够防止代码中使用无效的类参数,从而保证代码的类安全性。值得注意的是,我们只能使用 extends 关键字来添加上限限制,而不能添加下限限制。 下面是一个例子,演示如何使用 extends 关键字: ``` public class Box<T extends Number> { private T t; public Box(T t) { this.t = t; } public T get() { return t; } public void set(T t) { this.t = t; } } ``` 可以看到,Box 类使用了 extends 关键字,将参数 T 限制为 Number 类或其子类。在此之后,我们就可以在 Box 类中安全地使用 Number 类或其子类,如 Integer、Double 等。 除了上限限制之外,Java 还提供了另一种参数的约束方式:super 关键字。使用 super 关键字,我们可以限制参数必须是某个类或接口的父类。这个约束通常用于需要消费对象的情况中,例如集合类的 add 方法。通过为参数添加 super 关键字,我们可以保证只能添加某个类的子类到集合中,从而防止集合中出现无效的元素。类似地,我们也只能使用 super 关键字添加下限限制,而不能添加上限限制。 这里是一个例子,演示如何使用 super 关键字: ``` public class Box<T> { private List<? super T> list; public Box() { list = new ArrayList<>(); } public void add(T t) { list.add(t); } public void addAll(List<? extends T> otherList) { list.addAll(otherList); } } ``` 可以看到,Box 类使用了 super 关键字来限定集合中存储的类,只能是 T 的父类或其本身。这样做的好处是,保证添加到集合中的元素都是类安全的,避免了程序运行时出现错误。 总之,参数的 extend 和 super 关键字是 Java使用的重要工具,能够帮助我们实现类安全的代码。在实际使用中,根据具体场景灵活运用这两个关键字,能够提高代码的可读性和可维护性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值