You've got this backwards. The code creates an object of type ArrayQueue and assigns it to a reference of type QueueInterface. Because ArrayQueue implements the QueueInterface, ArrayQueue "is a" QueueInterface. It is valid for a QueueInterface to point to an ArrayQueue.
Ohhhh, okay. I was def wrong on how the assignment was going on. Makes a lot more sense now!
Yes, he could have used ArrayQueue on the left too, but in OOP it's a good practice to keep things general. If you can use an interface or a base class to define a variable you should do it. That way, if you found ArrayQueue is not the best QueueInterface implementation, you only need to change one word in the code. It doesn't sound that great (change one word instead of two), but in bigger projects and complex situations it can make a difference, mainlly in the readability and mantainability of the code.
I see your point about "general programming", not sure why I skipped that aspect. I guess I was just confused when I thought an interface object was being created, which didnt make sense to me because the methods aren't defined. Totally forgot that myQueue was a reference type and it makes sense for it to refer to a type that extends QueueInterface because it "is-a" type of QueueInterface