Error when binding a field which is not from the current class but from an enclosing class or the current class

Remi Forax forax at
Sat Sep 29 17:21:26 UTC 2018

This code compile but doesn't pass the verifier

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

import static java.util.Objects.requireNonNull;

public class StudentList {
  private final ArrayList<String> list = new ArrayList<>();
  public void add(String student) -> list.add(requireNonNull(student));
  public List<String> asList() -> new AbstractList<>() {
    public int size() = list::size;
    public String get(int index) = list::get;
  public static void main(String[] args) {
    var students = new StudentList();

get() (or size()) is compiled as
public java.lang.String get(int);
       0: aload_0
       1: getfield      #3                  // Field StudentList.list:Ljava/util/ArrayList;
       4: iload_1
       5: invokevirtual #5                  // Method java/util/ArrayList.get:(I)Ljava/lang/Object;
       8: areturn

the owner of getfield should be StudentList$1 not StudentList.


More information about the amber-dev mailing list