On this page:
Getting started
Let there be JSON
What’s data without a little self-reference?
8.5

Lab 7: Parametric data and visitors

Goals: Practice implementing the visitor pattern and using generics in a novel class.

Getting started

Copy and paste the following (hopefully) familiar code into Eclipse:
// Represents functions of signature A -> R, for some argument type A and // result type R interface IFunc<A, R> {
R apply(A input);
}
 
// generic list interface IList<T> {
// map over a list, and produce a new list with a (possibly different) // element type <U> IList<U> map(IFunc<T, U> f);
}
 
// empty generic list class MtList<T> implements IList<T> {
public <U> IList<U> map(IFunc<T, U> f) {
return new MtList<U>();
}
}
 
// non-empty generic list class ConsList<T> implements IList<T> {
T first;
IList<T> rest;
 
ConsList(T first, IList<T> rest) {
this.first = first;
this.rest = rest;
}
 
public <U> IList<U> map(IFunc<T, U> f) {
return new ConsList<U>(f.apply(this.first), this.rest.map(f));
}
}

Let there be JSON

JSON is an industry-standard data structure that allows for the storage and sharing of tree-shaped data. Below is a definition of a subset of JSON (more will come later). A JSON can either be a blank value, a number, boolean, or string. In the real world, JSON numbers can have decimal values, but for our purposes we’ll stick to integers.

Copy and paste the following definition into Eclipse:
// a json value interface IJSON {}
 
// no value class JSONBlank implements IJSON {}
 
// a number class JSONNumber implements IJSON {
int number;
 
JSONNumber(int number) {
this.number = number;
}
}
 
// a boolean class JSONBool implements IJSON {
boolean bool;
 
JSONBool(boolean bool) {
this.bool = bool;
}
}
 
// a string class JSONString implements IJSON {
String str;
 
JSONString(String str) {
this.str = str;
}
}

What’s data without a little self-reference?

As the definition for JSON stands in our current form, it’s not very useful. After all, it doesn’t allow for our favorite type of data: lists! Let’s extend the definition to allow for them.

Copy and paste the following definition into Eclipse:
//a list of JSON values class JSONList implements IJSON {
IList<IJSON> values;
 
JSONList(IList<IJSON> values) {
this.values = values;
}
}

Do a sanity check: does your IJSON interface have anything other than an accept method? If so, you have likely not implemented the visitor pattern correctly. Ask a staff member for further clarification. If not, continue onwards.