Yes, because at the time of specialization the compiler knows that the instance you are using is using the inherited type TTest2, which is what is actually put in the ObjectList.
And this is also important, because when you create the TTest here, this does not have a B, so you would have your TTest2List which inherits from it, that assumes that all elements are TTest2, but one of them isn't. Consider you call AddAllA and afterwards call AddAllB. AddAllB requires that all elements are of type TTest2, because it requires the member "B" to be read from teh object, so the element added in AddAllA is of type TTest and has no member "B" and would therefore not not be valid in the same list that is used for AddAllB.
If you want to add an Object of which you know it is of the right type, but you only get it as the parent type, you can cast it:
function CreateSomeTTest: TTest;
begin
Result := TTest2.Create; // Creates a TTest2 but returns it as parent type TTest
end;
function TTestInheritedList.AddAllA: Integer;
var
i: Integer;
begin
Add(CreateSomeTTest as T); // CreateSomeTTest returns a TTest, but if you are sure that it is of the correct type for that list you can cast it via "as"
Result := 0;
for i:=0 to Count-1 do
Result += Items[i].A;
end;