Besides using the parameterized types that are in the APIs, we could define our own parameterized type. Suppose we want a collection object that remembers seven things: as soon as you add more than seven items, it forgets about something that has already been stored. Below there is a class called LimitedMemory that can be used to represent such an object.
It is assumed that all the objects that are to be stored in a LimitedMemory object are all of the same type. For this reason, it is written as a parameterized class type. Rather than use E, I have chosen to use the name GType.
One other thing: it is also assumed that each object has a value, and so each object is of a class that implements the Valuable interface. The code below introduces one type that meets these constraints; it is the type Name.
0914: public interface Valuable // Valuable.java 0915: { 0916: public int value(); 0917: }
0918: public class Name implements Valuable // Name.java 0919: { 0920: private String iString; 0921: public Name(String pString) 0922: { 0923: iString = pString; 0924: } 0925: public String toString() 0926: { 0927: return iString; 0928: } 0929: public int value() 0930: { 0931: return iString.length(); 0932: } 0933: }
0934: import java.util.ArrayList; // LimitedMemory.java 0935: import java.util.Iterator; 0936: import java.util.Random; 0937: public class LimitedMemory <GType extends Valuable> 0938: implements Iterable<GType> 0939: { 0940: private static final int iCapacity = 7; 0941: private ArrayList<GType> iArrayList; 0942: private Random iRandom; 0943: public LimitedMemory() 0944: { 0945: iArrayList = new ArrayList<GType>(iCapacity); 0946: iRandom = new Random(); 0947: } 0948: public void add(GType pGType) 0949: { 0950: if (iArrayList.size()<iCapacity) 0951: iArrayList.add(pGType); 0952: else 0953: iArrayList.set(iRandom.nextInt(iCapacity), pGType); 0954: } 0955: public String toString() 0956: { 0957: return iArrayList.toString(); 0958: } 0959: public int value() 0960: { 0961: int tSum = 0; 0962: for (GType tGType : iArrayList) 0963: { 0964: tSum += tGType.value(); 0965: } 0966: return tSum; 0967: } 0968: public Iterator<GType> iterator() 0969: { 0970: return iArrayList.iterator(); 0971: } 0972: }
Here are two fragments of code that use a LimitedMemory object:
0978: LimitedMemory<Name> tLimitedMemory = new LimitedMemory<Name>(); 0979: tLimitedMemory.add(new Name("jim")); 0980: tLimitedMemory.add(new Name("bert"));
1031: iMyPrintln(tLimitedMemory); 1032: System.out.println(" " + tLimitedMemory.value()); 1033: LimitedMemory<Name> tLimitedMemory2 = new LimitedMemory<Name>(); 1034: tLimitedMemory2.add(new Name("jim")); 1035: tLimitedMemory2.add(new Name("bert")); 1036: tLimitedMemory2.add(new Name("jill")); 1037: System.out.println(iBiggestCost(tLimitedMemory, tLimitedMemory2));
The above code uses the following subsidiary methods:
1039: private static void iMyPrintln(LimitedMemory<Name> pLimitedMemory) 1040: { 1041: System.out.print("+"); 1042: for (Name tName : pLimitedMemory) 1043: { 1044: System.out.print(tName + "+"); 1045: } 1046: System.out.println(); 1047: } 1048: private static 1049: <GType1 extends Valuable, GType2 extends Valuable> 1050: int iBiggestCost( 1051: LimitedMemory<GType1> pLimitedMemory1, 1052: LimitedMemory<GType2> pLimitedMemory2) 1053: { 1054: return Math.max(pLimitedMemory1.value(), pLimitedMemory2.value()); 1055: }