当前位置:编程学习 > JAVA >>

泛型的一个问题,程序简单,错误无法理解

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方法的参数,对类型并没有限定呀 泛型 通配符 --------------------编程问答-------------------- UseCase3<? extends List> a=new UseCase3<ArrayList>();
这里限制了,不要这么向上转型
因为如果类型参数是? extends List的话,系统无法验证任何一个类是否是安全的
要用的就用<? super ArrayList> 这样的话,系统至少知道new ArrayList()一定是安全的 --------------------编程问答-------------------- 1楼的同学,我刚学泛型,你说的我不太理解。T t不是可以接受任何类型嘛,为什么不安全的?UseCase3<? extends List> a=new UseCase3<ArrayList>();这里的限定,我是想测试下doSomething方法的。能详细给我说说吗 --------------------编程问答-------------------- 坐等高手赐教 --------------------编程问答-------------------- 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());
}

 T 是接受实例化的时候的 new UseCase3<? extends List>();
也就是说 T代表的是继承List的任意类。
所以print(? extends List)参数也必须是List的子类。 --------------------编程问答--------------------
引用 4 楼 sdojqy1122 的回复:
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());
}

 T 是接受实例化的时候的 new UseCase3<? extends List>();
也就是说 T代表的是继承List的任意类。
所以print(? extends List)参数也必须是List的子类。

楼主打扰了。继承我用的不熟。sorry --------------------编程问答--------------------
UseCase3<? extends List> a=new UseCase3<ArrayList>();

这个时候a.print方法实际上是
public void print(? extends List t){
System.out.println(t.getClass().getName());
}

它是无法接受任何参数的 --------------------编程问答--------------------
引用 6 楼 Cecil_911 的回复:
UseCase3<? extends List> a=new UseCase3<ArrayList>();

这个时候a.print方法实际上是
public void print(? extends List t){
System.out.println(t.getClass().getName());
}

它是无法接受任何参数的


+1

--------------------编程问答--------------------
引用 6 楼 Cecil_911 的回复:
UseCase3<? extends List> a=new UseCase3<ArrayList>();

这个时候a.print方法实际上是
public void print(? extends List t){
System.out.println(t.getClass().getName());
}

它是无法接受任何参数的

有点不懂,想问下6楼   (? extends List t)不是限定T只能是继承了List的类嘛。那为什么a.print(new ArrayList());这句也不正确呢 --------------------编程问答--------------------
引用 8 楼 vampire_vivan 的回复:
有点不懂,想问下6楼   (? extends List t)不是限定T只能是继承了List的类嘛。那为什么a.print(new ArrayList());这句也不正确呢


? extends List

的意思是“只有某一种List的子类型可以”,至于到底哪一种,不知道。
所以当你给出任何一种类型,即使是 List 的子类型,对于它到底是不是符合条件,答案是“不知道”。

“不知道” 的处理方式是 “不符合”。 --------------------编程问答--------------------
引用 8 楼 vampire_vivan 的回复:
有点不懂,想问下6楼   (? extends List t)不是限定T只能是继承了List的类嘛。那为什么a.print(new ArrayList());这句也不正确呢


接 9 楼,那 ? extends List 各种不知道,这么写还有什么意义呢?

—— 作为返回值的时候,有意义。

就算是不知道,它总是 List 的子类型,如果是返回值,一定可以赋值给声明为 List 的变量,一定具有 List 里面定义的方法。 --------------------编程问答--------------------
引用 10 楼 raistlic 的回复:
Quote: 引用 8 楼 vampire_vivan 的回复:

有点不懂,想问下6楼   (? extends List t)不是限定T只能是继承了List的类嘛。那为什么a.print(new ArrayList());这句也不正确呢


接 9 楼,那 ? extends List 各种不知道,这么写还有什么意义呢?

—— 作为返回值的时候,有意义。

就算是不知道,它总是 List 的子类型,如果是返回值,一定可以赋值给声明为 List 的变量,一定具有 List 里面定义的方法。

+1 --------------------编程问答--------------------
引用 9 楼 raistlic 的回复:
Quote: 引用 8 楼 vampire_vivan 的回复:

有点不懂,想问下6楼   (? extends List t)不是限定T只能是继承了List的类嘛。那为什么a.print(new ArrayList());这句也不正确呢


? extends List

的意思是“只有某一种List的子类型可以”,至于到底哪一种,不知道。
所以当你给出任何一种类型,即使是 List 的子类型,对于它到底是不是符合条件,答案是“不知道”。

“不知道” 的处理方式是 “不符合”。
+1 --------------------编程问答--------------------
引用 9 楼 raistlic 的回复:
Quote: 引用 8 楼 vampire_vivan 的回复:

有点不懂,想问下6楼   (? extends List t)不是限定T只能是继承了List的类嘛。那为什么a.print(new ArrayList());这句也不正确呢


? 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
补充:Java ,  Java SE
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,