Parametrised interfaces were removed in Winter '13 (Release Notes, page 191), and you cannot create them in code saved with API version 26 or above. However they are still used by a number of internal Salesforce interfaces, such as Database.Batchable.
Parametrised interfaces (and classes) are common in other OO-languages such as C# and Java, where they are referred to as generics and are much more flexible (C# documentation, Java documentation).
There is still some old database.com documentation available which explains how to create and use them.
Parameterized Typing and Interfaces
Parameterized typing allows interfaces to be implemented with generic data type parameters that are replaced with actual data types upon construction.
The following gives an example of how the syntax of a parameterized interface works. In this example, the interface Pair has two type variables, T and U. A type variable can be used like a regular type in the body of the interface.
public virtual interface Pair<T, U> {
T getFirst();
U getSecond();
void setFirst(T val);
void setSecond(U val);
Pair<U, T> swap();
}
The following interface DoubleUp extends the Pair interface. It uses the type variable T:
public interface DoubleUp<T> extends Pair<T, T> {}
Implementing Parameterized Interfaces
A class that implements a parameterized interface must pass data types in as arguments to the interface's type parameters.
public class StringPair implements DoubleUp<String> {
private String s1;
private String s2;
public StringPair(String s1, String s2) {
this.s1 = s1;
this.s2 = s2;
}
public String getFirst() { return this.s1; }
public String getSecond() { return this.s2; }
public void setFirst(String val) { this.s1 = val; }
public void setSecond(String val) { this.s2 = val; }
public Pair<String, String> swap() {
return new StringPair(this.s2, this.s1);
}
}