import java.util.*;public class UseCase3 <T>{
public void doSomething(UseCase3<? extends List> a){
System.out.println(a.getClass().getName());
}
public void print(T t){
System.out.println(t.getClass().getName());
} public static void main(String[] args) {
// TODO 自动生成方法存根
UseCase3<? extends List> a=new UseCase3<ArrayList>();
a.doSomething(new UseCase3<ArrayList>());
a.doSomething(new UseCase3<LinkedList>());
a.print(new UseCase3<ArrayList>());
UseCase3<Object> a2=new UseCase3<Object>();
a2.print(a2);
}
}请问下这句a.print(new UseCase3<ArrayList>());为什么报错?print方法的参数,对类型并没有限定呀泛型通配符
public void doSomething(UseCase3<? extends List> a){
System.out.println(a.getClass().getName());
}
public void print(T t){
System.out.println(t.getClass().getName());
} public static void main(String[] args) {
// TODO 自动生成方法存根
UseCase3<? extends List> a=new UseCase3<ArrayList>();
a.doSomething(new UseCase3<ArrayList>());
a.doSomething(new UseCase3<LinkedList>());
a.print(new UseCase3<ArrayList>());
UseCase3<Object> a2=new UseCase3<Object>();
a2.print(a2);
}
}请问下这句a.print(new UseCase3<ArrayList>());为什么报错?print方法的参数,对类型并没有限定呀泛型通配符
这里限制了,不要这么向上转型
因为如果类型参数是? extends List的话,系统无法验证任何一个类是否是安全的
要用的就用<? super ArrayList> 这样的话,系统至少知道new ArrayList()一定是安全的
public void doSomething(UseCase3<? extends List> a){
System.out.println(a.getClass().getName());
}
public void print(T t){
System.out.println(t.getClass().getName());
} T 是接受实例化的时候的 new UseCase3<? extends List>();
也就是说 T代表的是继承List的任意类。
所以print(? extends List)参数也必须是List的子类。
这个时候a.print方法实际上是public void print(? extends List t){
System.out.println(t.getClass().getName());
}它是无法接受任何参数的
? extends List的意思是“只有某一种List的子类型可以”,至于到底哪一种,不知道。
所以当你给出任何一种类型,即使是 List 的子类型,对于它到底是不是符合条件,答案是“不知道”。“不知道” 的处理方式是 “不符合”。
接 9 楼,那 ? extends List 各种不知道,这么写还有什么意义呢?—— 作为返回值的时候,有意义。就算是不知道,它总是 List 的子类型,如果是返回值,一定可以赋值给声明为 List 的变量,一定具有 List 里面定义的方法。
接 9 楼,那 ? extends List 各种不知道,这么写还有什么意义呢?—— 作为返回值的时候,有意义。就算是不知道,它总是 List 的子类型,如果是返回值,一定可以赋值给声明为 List 的变量,一定具有 List 里面定义的方法。
+1
? extends List的意思是“只有某一种List的子类型可以”,至于到底哪一种,不知道。
所以当你给出任何一种类型,即使是 List 的子类型,对于它到底是不是符合条件,答案是“不知道”。“不知道” 的处理方式是 “不符合”。+1
? extends List的意思是“只有某一种List的子类型可以”,至于到底哪一种,不知道。
所以当你给出任何一种类型,即使是 List 的子类型,对于它到底是不是符合条件,答案是“不知道”。“不知道” 的处理方式是 “不符合”。
我再想想的
你调用的时候,是引用不到定义时候的?的
要用extends就直接X extends List好了
方法的可以写成
public <X extends List> doSomething(UseCase3<X> a)应该跟你那个效果一样
package test;import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;public class UseCase3<T>
{
public void doSomething(UseCase3<? extends List<String>> a)//修改的地方
{
System.out.println(a.getClass().getName());
}
public void print(UseCase3<?> t) //修改的地方
{
System.out.println(t.getClass().getName());
} public static void main(String[] args)
{
UseCase3<? extends List<String>> a = new UseCase3<ArrayList<String>>(); //修改的地方
a.doSomething(new UseCase3<ArrayList<String>>()); //修改的地方
a.doSomething(new UseCase3<LinkedList<String>>()); //修改的地方
a.print(new UseCase3<ArrayList<String>>()); //修改的地方
UseCase3<Object> a2 = new UseCase3<Object>();
a2.print(a2); }
}运行结果
test.UseCase3
test.UseCase3
test.UseCase3
test.UseCase3