Anonymous Inner Classes Inside Methods

前端 未结 2 1931
既然无缘
既然无缘 2020-12-09 23:32

Please have a look at following code :

import java.util.ArrayList;
import java.util.List;

class Main{
     public static  List modifiedLis         


        
相关标签:
2条回答
  • 2020-12-10 00:11
    import java.util.ArrayList;
    import java.util.List;
    
    class Main{
        public static <T> List<T> modifiedList(final List<T> list){
             return new ArrayList<T>(){
    
                 private List<T> originalList=list;
    
                 @Override
                 public boolean add(T element){
                     super.add(element);
                     return originalList.add(element);
                 }
             };
         }
    
         public static void main(String[] args) {
             List<String> originalList=new ArrayList<String>();
             List<String> duplicateList=modifiedList(originalList);
             originalList.add("1");
             originalList.add("2");
             originalList.add("3");
             System.out.println(originalList+" "+duplicateList);
             duplicateList.add("4");
             duplicateList.add("5");
             duplicateList.add("6");
             System.out.println(originalList+" "+duplicateList);       
         }
     }
    

    Java allows such a strange thing just in order to make things easier for programmers. Both the codes are semantically same and boil down to the identical bytecode.

    0 讨论(0)
  • 2020-12-10 00:12

    Essentially the code is rewritten by the complier as (note I didn't try to compile it..., might have errors):

    class Main$1<T>
        extends ArrayList<T>
    {
        private final List<T> list;
    
        Main$1(final List<T> a)
        {
            list = a;
        }
    
        @Override
        public boolean add(T element)
        {
            super.add(element);
            return list.add(element);
        }
    }
    

    and

    class Main{
         public static <T> List<T> modifiedList(final List<T> list)
         {
             return new Main$1<T>(list);
         }
    
         public static void main(String[] args) 
         {
             List<String> originalList=new ArrayList<String>();
             List<String> duplicateList=modifiedList(originalList);
             originalList.add("1");
             originalList.add("2");
             originalList.add("3");
             System.out.println(originalList+" "+duplicateList);
             duplicateList.add("4");
             duplicateList.add("5");
             duplicateList.add("6");
             System.out.println(originalList+" "+duplicateList);
         }
    
    0 讨论(0)
提交回复
热议问题