作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
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>
.
思考的好方法extends
和 super
在泛型中是指赋值: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/
我是一名优秀的程序员,十分优秀!