Sì, c'è. Sarà una soluzione completamente in fase di esecuzione (nessuna verifica del tipo in fase di compilazione), ma ne vale la pena (si verificherà un arresto anomalo anticipato al primo tentativo di inserire un oggetto con un tipo errato).
public class TypedArrayList extends ArrayList {
private final Class elementType;
public TypedList(Class elementType) {
this.elementType = elementType;
}
@Override
public boolean add(Object element) {
// preffered version, use it if it's available on your platform
// if (!elementType.isInstance(element)) {
if (!elementType.equals(element.getClass())) {
throw new IllegalArgumentException("Object of type " + element.getClass() + "passed to List of "+ elementType);
}
return super.add(element);
}
// override other methods
// that need type checking
}
Utilizzo:
TypedArrayList list = new TypedArrayList(String.class);
list.add("works!");
list.add(new Object()); // throws exception
Puoi fare lo stesso per LinkedList e qualsiasi altro tipo di elenco.