求问 返回类型如何变成内部类类型。
@SuppressWarnings("unused")
public static void main(String[] args) {
List<String> l = new ArrayList<String>(){
private static final long serialVersionUID = -5162194221267685944L;
public List<String> addList(List<String> list ){
this.addAll(new TreeSet<String>(list){
private static final long serialVersionUID = 603932641888586401L;
{
System.out.println(this.getClass());
}
@Override
public Comparator<? super String> comparator() {
return super.comparator();
}
});
return this;
// return Class.forName(this.getClass().toString())this;
}
public List<String> addList1(List<String> list ){
this.addAll(new TreeSet<String>(new Comparator<String>() {
@Override
public int compare(String o1, String o2) {
return o1.compareTo("");
}
}){
private static final long serialVersionUID = -603932641888586401L;
});
return this;
}
{
System.out.println(this.getClass());
}
}.addList(new ArrayList<String>())
// .addList1(new ArrayList<String>())
;

}

解决方案 »

  1.   

    我来也!问题一:匿名类无法多继承,你需要合成一个公共接口,因为只有通过这个接口才可以暴露出你想使用的addList1,参见ExtraArrayList
    问题二:你需要了解下逆变的概念,顺便协变也可以了解下,参见addList方法的返回值
    import java.util.ArrayList;
    import java.util.Comparator;
    import java.util.List;
    import java.util.TreeSet;
    public class Main {

    @SuppressWarnings("unused")
        public static void main(String[] args) {
            List<String> l = new ExtraArrayList<String>() {
                private static final long serialVersionUID = -5162194221267685944L;
                public ExtraArrayList<String> addList(List<String> list) { // Contravariant is used
                    this.addAll(new TreeSet<String>(list){
                        private static final long serialVersionUID = 603932641888586401L;
                        {
                            System.out.println(this.getClass());
                        }
                        @Override
                        public Comparator<? super String> comparator() {
                            return super.comparator();
                        }
                    });
                    return this;
    //              return Class.forName(this.getClass().toString())this;
                }
                public List<String> addList1(List<String> list ){
                    this.addAll(new TreeSet<String>(new Comparator<String>() {
                        public int compare(String o1, String o2) {
                            return o1.compareTo("");
                        }
                    }){
                        private static final long serialVersionUID = -603932641888586401L;
                    });
                    return this;
                }
            {
                System.out.println(this.getClass());
            }
            }.addList(new ArrayList<String>())
            .addList1(new ArrayList<String>())
            ;
             
        }
    }
    interface ExtraListMethod<T> {
    public List<T> addList1(List<String> list);
    }
    abstract class ExtraArrayList <T> extends ArrayList<T> implements ExtraListMethod<T> {
    private static final long serialVersionUID = 1494777471260167L;
    }
      

  2.   

    明白你的做法,你这样就是给匿名类一个名字。
    在不给名字的情况下,如何使用反射让addList返回类型变成匿名类?
      

  3.   


    import java.lang.reflect.Method;
    import java.util.ArrayList;
    import java.util.Comparator;
    import java.util.List;
    import java.util.TreeSet;public class Main2 {

    @SuppressWarnings("unused")
        public static void main(String[] args) throws Exception {
            List<String> l = new ArrayList<String>() {
                private static final long serialVersionUID = -5162194221267685944L;
                public List<String> addList(List<String> list) { // Contravariant is used
                    this.addAll(new TreeSet<String>(list){
                        private static final long serialVersionUID = 603932641888586401L;
                        {
                            System.out.println(this.getClass());
                        }
                        @Override
                        public Comparator<? super String> comparator() {
                            return super.comparator();
                        }
                    });
                    return this;
    //              return Class.forName(this.getClass().toString())this;
                }
                public List<String> addList1(List<String> list ){
                    this.addAll(new TreeSet<String>(new Comparator<String>() {
                        public int compare(String o1, String o2) {
                            return o1.compareTo("");
                        }
                    }){
                        private static final long serialVersionUID = -603932641888586401L;
                    });
                    return this;
                }
            {
                System.out.println(this.getClass());
            }
            }.addList(new ArrayList<String>())
            //.addList1(new ArrayList<String>())
            ;
            Method m = l.getClass().getMethod("addList1", List.class);
            m.invoke(l, new ArrayList<String>());
        }
    }
      

  4.   

    匿名类型的方法签名完全取决于父类型,无论它内部定义多少public成员,我们都是无法访问的。除非你为这些public成员定义相应的访问接口,通过访问接口来进行访问。