请查看以下代码:
import java.util.ArrayList;
import java.util.List;
class Main{
public static <T> List<T> modifiedList(final List<T> list){
return new ArrayList<T>(){
@Override
public boolean add(T element){
super.add(element);
return list.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);
}
在上面的代码中,在modifyList()方法中声明的匿名内部类的实例能够访问传递给该方法的参数。 AFAIK Java为内部类创建了一个单独的字节码文件。
任何人都可以解释Java在字节码级别如何处理这些局部变量绑定?我的意思是,Java如何跟踪作为参数传递给该方法的对象的引用?
非常感谢任何帮助!
[抱歉我的英语不好!如果您理解我的问题,请编辑此帖并删除语法错误。谢谢!的
答案 0 :(得分:9)
基本上代码由编译器重写(注意我没有尝试编译它......可能有错误):
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);
}
}
和
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);
}
答案 1 :(得分:5)
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允许这样一个奇怪的事情只是为了让程序员更容易。 两个代码在语义上都相同,并归结为相同的字节码。