If you are asking about upcasting a List<B> to a List<A>, where B is a subclass of A, then
the List.cast method will not make a copy of the List<B>, but will make a view of it that has type List<A>.
But you can never assign an element of type A to this view, unless it actually is of type B, because it needs to be stored in the underlying List<B>.
The List.of, List.from, and literal constructors will all construct a new list, and should be closely equivalent in performance.
List.of could potentially skip a check that each element is an A when copying it, because List.of knows that its input only has elements of type B, which is an A.
The literal constructor would also know this.
I would suggest the literal constructor
<A>[ ...myListB ]
Using List.cast lets you avoid creating a new object, and copying all the elements of your list to the new object. This could be expensive if the list is big.
I don't know what you mean by "The context here is for list downcasting". Are you asking about list upcasting or list downcasting?
In many cases, you should not need to upcast a List<B> to a List<A> - because of covariant generic subtyping, a List<B> is a List<A>: List<B> is a subtype of List<A>.
A List<B> can be used directly anywhere a List<A> can, except that assigning a non-B element to it will be a run-time error.
This is exactly the situation where you really need to make a new List<A> that is a copy of the elements of your List<B>.