zoukankan      html  css  js  c++  java
  • java 学习中遇到的问题(二)泛型中<? extends T>和<? super T>的区别

    对于一个是List<? extends T>类型的引用list1,这实际上是某种list1引用没有指定的具体类型,它是T的一种子类,但到底是哪一种子类,编译器也无法确定,因此无法使用add()来添加对象,但是因为可以确定这个list1中的任何对象至少是T类型的,因此可以用get()来返回一个T类型的对象。

    而对于一个是List<? super T>类型的引用list2,这实际上是T的一种基类,但由于不能确定到底是哪一种基类,因此list2使用get()返回来的只能是一个Object类型,原本的T类型会丢失,不过由于已经知道参数是T的某种基类,所以向其中添加T或T的子类型都是安全的,但若是向其中添加任何T的基类则会由于不确定性而报错(即使添加Object类型也不行)。

     1 import java.util.*;
     2 
     3 public class Demo_twentyeight {
     4     static class Generic1<T>{
     5         private T item;
     6         public void put(T item){
     7             this.item=item;
     8         }
     9     }
    10 
    11     static class Generic2<T>{
    12         T item;
    13         T get(){
    14             return item;
    15         }
    16     }
    17     static <T> void f1(Generic1<? super T> generic1,T item){
    18         generic1.put(item);
    19     }
    20     static <T> void f2(Generic2<? extends T> generic2){
    21         generic2.get();
    22     }
    23     public static void main(String[] args) {
    24         Generic1<Fruit> g1=new Generic1<Fruit>();
    25         g1.put(new Apple());
    26         g1.put(new Fruit());
    27 //        g1.put(new Object());  //编译无法通过
    28         Generic2<Fruit> g2=new Generic2<Fruit>();
    29         Fruit f1=g2.get();
    30     }
    31 
    32 }

    更详细的解答(一位大神写的):http://zhidao.baidu.com/question/646868566975781205.html

  • 相关阅读:
    1093 Count PAT's(25 分)
    1089 Insert or Merge(25 分)
    1088 Rational Arithmetic(20 分)
    1081 Rational Sum(20 分)
    1069 The Black Hole of Numbers(20 分)
    1059 Prime Factors(25 分)
    1050 String Subtraction (20)
    根据生日计算员工年龄
    动态获取当前日期和时间
    对计数结果进行4舍5入
  • 原文地址:https://www.cnblogs.com/grj0011/p/4941212.html
Copyright © 2011-2022 走看看