public class Context { private ParentType parent; public Context() {} public ParentType getParent() { return parent; } public void setParent(ParentType parent) { this.parent = parent; } public Field intField() { return new Field() { @Override public Integer get() { return 0; } @Override public ParentType set(Integer t) { return parent; } }; } public abstract class Field { //Note this is a path dependent type public abstract T get(); public abstract ParentType set(T t); } }