1

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>());
    }
}

其中标识是问题的子类。

这就是我的持有人班级的样子

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>)
4

5 回答 5

5

对我来说,这个错误看起来很不言自明——该set​​方法需要 aHolder<? super Question>并且你试图给它一个 Holder 的东西,它是Question. 如所写,例如Exam.set可以采用 a 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>值。

于 2012-09-06T11:00:53.630 回答
1

Exam<T>期望 aHolder<T>可以包含 T 的任何子类。这就是它的super作用。你正在传递一个Holder<Identification>Identification既不是T也不是它的超类。

于 2012-09-06T11:04:00.203 回答
1

将类 Enum 的 set 方法更改为

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

}
于 2012-09-06T11:09:50.413 回答
0

泛型是不变的。这可能是你的答案。不变意味着 Type2 是 Type1 的子类,因此并不意味着 List 是 List。

于 2012-09-06T11:04:28.820 回答
0

如果你写,它可以工作(但当然有不同的含义)

public  void set(Holder<? extends T> hold){ }
于 2012-09-06T11:08:16.150 回答