There is a class, which allows the construction of new ListNodes. Each time you construct a ListNode you are required to indicate the type of ListNode you want, where part of the type is a different class that implements the Comparable interface and the other class can be anything.
ListNode<Date, String> node = new ListNode<>();
is an example.
With such an example, you would then have a ListNode that looked more like:
public class ListNode {
Date key;
String value;
ListNode<Date, String> next;
ListNode(Date key, String value, ListNode<Date,String> next) {
this.key = key;
this.value = value;
this.next = next;
}
}
The stuff between the < and > is the generic type, and is a feature of Java better known as "Java Generics". You should read up on it. It is slightly beyond the scope of a complete explanation within one post, but hopefully the above example will give you an idea. It allows one to write a class that generically takes a pseudo-type-argument.
The comparable interface is a special interface which provides a linear ordering of some type. For example, you could do alphabetical ordering of Strings, in which case you would have something that looked like
public StringComparator implements Comparable<String> ....
it works by the Comparable keyword forcing an implementation of a method to be defined.
public int compareTo(String other) {
...
}
Where if the returned integer is negative the other comes before this item, if the returned value is positive, the other comes after this item, and if the returned value is zero, then the two items are (for ordering purposes) equivalent.