Rileggendo questa frase, allora la questione è questa. Innanzitutto non so se la ProcElement è astratta o no. E se non lo è, se andrai ad istanziare oggetti ProcElement.
Se i tuoi oggetti istanziati sono solo dei Task o SendTask e un tuo metodo li "vede" solo come tipo ProcElement (insomma a livello più generico), allora può avere senso andare a verificare che tipo di oggetto è realmente (Task o SendTask), quindi fare un cast e inserirlo nel rispettivo ArrayList. Questo sì, è possibile. Se un oggetto è realmente un Task, allora ha senso ed è lecito metterlo in un ArrayList<Task> !