Discuss / Java / 只读不写的一点理解

只读不写的一点理解

Topic source

佐上楼兰

#1 Created at ... [Delete] [Delete and Lock User]

要理解廖老师说的只读不写,你只需要弄清楚1个问题,那就是当前你要处理的对象从何而来

请考虑以下两种情况:

情况一,对象由你创建而来

比如

public class Main{
  public static void main(String[] args){
    Pair<Integer> p = new Pair<Integer>(123,234);
    //对象由你创建,所以你很清楚它的泛型类型就是Integer,所以以下的读方法都可以编译运行:
    Number first = p.getFirst();
    Number last = p.getLast();
    Integer first_int = (Integer)p.getFirst();
    Integer last_int = (Integer)p.getLast();
    //以下的写方法也同样可以编译运行
    p.setFirst(new Integer("888"));
    p.setLast(new Integer("999"));
  }
}


    

情况二,对象由他人创建而来

比如说你和他人共同开发项目,Pair<T>由他人编写,而你的任务是在某个逻辑处理类里接收并处理这个由他人创建的Pair<T>的实例对象 p:

public class Main{

  public static void main(String[] args){
    

  }
  //你编写了一个逻辑处理方法add:
    public void add(Pair<? extends Number> p){
      //p对象由他人创建,然后通过调用你编写的方法传参数进来,所以你根本不清楚它的具体泛型类型是什么,如果你还是按情况一的情况来编写代码会怎么样?:
      Number first = p.getFirst();//能编译运行
      Number last = p.getLast();//能编译运行
      Integer first_int = (Integer)p.getFirst();//如果别人创建的是Double类型的,ClassCastExcetion
      Integer last_int = (Integer)p.getLast();//如果别人创建的是Double类型的,ClassCastExcetion
      
      p.setFirst(new Integer("888"));//如果别人创建的是Double类型的,这条代码就是错误的代码,它甚至连编译都通过不了
      p.setLast(new Integer("999"));//如果别人创建的是Double类型的,这条代码就是错误的代码,它甚至连编译都通过不了

      //有人就想到了,既然我赋值具体的类型不行,那我保持跟方法参数泛型类型一致总该行了吧,比如:
      p.setFirst(p.getFirst());//抱歉,无法通过编译
      p.setLast(p.getLast());//抱歉,无法通过编译
    }
}

情况二较多见,所以当在某个逻辑处理方法中要处理带泛型的数据类型的时候,在该方法内部,对于泛型实例对象p,你只能读,不能写。


  • 1

Reply