关于通配符以及其上下限的意义的一些问题

明月镇魂 2018-01-30 07:04:43
import java.util.*;

import cn.haiyisoft.domain.PersonForGeneric;
import cn.haiyisoft.domain.StudentForGeneric;
import cn.haiyisoft.domain.WorkerForGeneric;

public class CollectionsDemo03 {

public static void main(String[] args) {
// 取最大值

List<String> list = new ArrayList<String>();


list.add("weblogic");
list.add("Linux");
list.add("windows");
list.add("DELL");
list.add("Logitech");

System.out.println(GetMax(list));

}

public static <T extends Comparable<? super T>> T GetMax(Collection<? extends T> coll) {

Iterator<? extends T> it = coll.iterator();

T T_max = it.next();

while (it.hasNext()) {
T temp = it.next();
if (T_max.compareTo(temp) < 0)
T_max = temp;
}

return T_max;

}

}


我想问一下 这个类中定义的泛型方法GetMax,其形参Collection<? extends T> coll 的泛型<? extends T>这个有什么意义么?
传入的Collection的泛型都是固定的了,例如Collection<String>,怎么会有接受T泛型子类情况出现?所以说此处是否可以直接定义为Collection<T> coll 呢?
另外
List<? super StudentForGeneric> lp = new ArrayList<PersonForGeneric>();

List<? extends PersonForGeneric> lp2 = new ArrayList<WorkerForGeneric>();

也有同样的问题,不是很清楚这几个泛型上下限在这里的含义。
...全文
578 10 打赏 收藏 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
明月镇魂 2018-02-05
  • 打赏
  • 举报
回复
引用 8 楼 u010863631 的回复:
[quote=引用 7 楼 rockpk008 的回复:] [quote=引用 4 楼 u010863631 的回复:] 可以直接用T,或者直接写List<String>类型接收都可以。 因为是demo,都可以实现,但是如果分开层次,服务层是不知道业务层是什么格式的,你写好服务层代码,业务层怎么调用就随意了。[/quote 您好,可否给我一个大概的例子,因为我仔细思考后发现无法想出应用场景。
几乎所有使用extends情况都可以直接用T,所以场景不容易举例。我自己写代码的时候几乎也都是用T,但部分情况下除外,比如 我定义一个接口,涉及到序列化参数public interface ITest<T,PK extends Serializable> 这时候如果用public interface ITest<T,Serializable>就会有警告,序列化不建议这么用,但你就这么用了也只是警告,没有错误。[/quote] 感谢您的回答
明月镇魂 2018-02-05
  • 打赏
  • 举报
回复
引用 5 楼 oyljerry 的回复:
[quote=引用 3 楼 明月镇魂的回复:][quote=引用 1 楼 oyljerry 的回复:] <? extends T>表示包括T在内的任何T的子类 就是各种子类型都可以做参数
您好,这个我明白什么意思,但是我觉得放在形参的List中没有什么意义,因为传入进来的Collection的泛型都是确定了的,例如worker是person的子类,但是传入Collection<worker>的时候worker对应着泛型T,并不是? extends T,所以我认为形参Collection的泛型直接写成Collection<T>即可。[/quote] 这更多的应该是一种语法上的描述。[/quote] 感谢您的回答
「已注销」 2018-02-02
  • 打赏
  • 举报
回复
引用 7 楼 rockpk008 的回复:
[quote=引用 4 楼 u010863631 的回复:] 可以直接用T,或者直接写List<String>类型接收都可以。 因为是demo,都可以实现,但是如果分开层次,服务层是不知道业务层是什么格式的,你写好服务层代码,业务层怎么调用就随意了。
您好,可否给我一个大概的例子,因为我仔细思考后发现无法想出应用场景。[/quote] 几乎所有使用extends情况都可以直接用T,所以场景不容易举例。我自己写代码的时候几乎也都是用T,但部分情况下除外,比如 我定义一个接口,涉及到序列化参数public interface ITest<T,PK extends Serializable> 这时候如果用public interface ITest<T,Serializable>就会有警告,序列化不建议这么用,但你就这么用了也只是警告,没有错误。
明月镇魂 2018-02-01
  • 打赏
  • 举报
回复
引用 4 楼 u010863631 的回复:
可以直接用T,或者直接写List<String>类型接收都可以。 因为是demo,都可以实现,但是如果分开层次,服务层是不知道业务层是什么格式的,你写好服务层代码,业务层怎么调用就随意了。
您好,可否给我一个大概的例子,因为我仔细思考后发现无法想出应用场景。
明月镇魂 2018-01-31
  • 打赏
  • 举报
回复
引用 1 楼 oyljerry 的回复:
<? extends T>表示包括T在内的任何T的子类 就是各种子类型都可以做参数
您好,这个我明白什么意思,但是我觉得放在形参的List中没有什么意义,因为传入进来的Collection的泛型都是确定了的,例如worker是person的子类,但是传入Collection<worker>的时候worker对应着泛型T,并不是? extends T,所以我认为形参Collection的泛型直接写成Collection<T>即可。
oyljerry 2018-01-31
  • 打赏
  • 举报
回复
引用 3 楼 明月镇魂的回复:
[quote=引用 1 楼 oyljerry 的回复:] <? extends T>表示包括T在内的任何T的子类 就是各种子类型都可以做参数
您好,这个我明白什么意思,但是我觉得放在形参的List中没有什么意义,因为传入进来的Collection的泛型都是确定了的,例如worker是person的子类,但是传入Collection<worker>的时候worker对应着泛型T,并不是? extends T,所以我认为形参Collection的泛型直接写成Collection<T>即可。[/quote] 这更多的应该是一种语法上的描述。
明月镇魂 2018-01-31
  • 打赏
  • 举报
回复
引用 1 楼 oyljerry的回复:
<? extends T>表示包括T在内的任何T的子类 就是各种子类型都可以做参数
您好,这个我明白什么意思,但是我觉得放在形参的List中没有什么意义,因为传入进来的List的泛型都是确定了的,例如worker是person的子类,但是传入list<worker>的时候worker对应着泛型T,并不是? extends T,所以我认为形参list的泛型直接写成list<T>即可。
「已注销」 2018-01-31
  • 打赏
  • 举报
回复
可以直接用T,或者直接写List<String>类型接收都可以。 因为是demo,都可以实现,但是如果分开层次,服务层是不知道业务层是什么格式的,你写好服务层代码,业务层怎么调用就随意了。
oyljerry 2018-01-30
  • 打赏
  • 举报
回复
<? extends T>表示包括T在内的任何T的子类 就是各种子类型都可以做参数

62,620

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧