gpt4 book ai didi

通配符上的 Java 泛型插入

转载 作者:行者123 更新时间:2023-11-29 06:40:56 25 4
gpt4 key购买 nike

Java 不允许我在此类中添加类型声明的子类

public class Exam<T> {

public void set(Holder<? super T> hold){

}
public T get(Holder<? extends T> holder){ return holder.get();}


public static void main (String[] args){
Exam<Question> eq = new Exam<Question>();
eq.set(new Holder<Identification>());
}
}

Identification 是 Question 的子类。

这就是我的 holder 类的样子

public class Holder<T> {
T item;

public void set(T item){ this.item = item; }
public T get(){return item;}
}

错误

The method set(Holder<? super Question>) in the type Exam<Question> is not applicable for the arguments (Holder<Identification>)

最佳答案

这个错误对我来说看起来很明显 - set方法需要一个 Holder<? super Question>你试图给它一个 Holder 的东西是 Question 的子类.如所写,Exam.set可以拿Holder<Object> ,例如,但不是 Holder<Identification> .

思考的好方法extendssuper在泛型中是指赋值:T extends Foo将接受任何类型 T您可以在 Foo 的赋值右侧使用没有类型转换,即

Foo something = new T();

(将其视为伪代码 - 我知道您实际上不允许 new 类型变量)。相反,T super Foo接受您可以在赋值左侧使用的任何 T 而无需强制转换:

T myThing = new Foo();

在您的具体示例中,Identification i = new Question()没有强制转换是不合法的,所以 Holder<? super Question>参数不能接受 Holder<Identification>值(value)。

关于通配符上的 Java 泛型插入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12298517/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com