The way you describe is typesafe (well not really, but it will throw a ClassCastException if you got it wrong), but probably the slowest and the most verbose way of doing this (although it is pretty clear). The example given which simply casts the the ArrayList is the fastest, but as the poster points out is not typesafe and of course you probably want to copy that to another list anyway. If you are prepared to give up your need to have this copied to an ArrayList and are happy with a List instead (which you should be), simply do:
List<ProductListBean> productList =
Arrays.asList(((List<ProductListBean>)getProductsList()).toArray(new ProductListBean[] {}));
It's fast because the underlying copying is done with System.arraycopy which is a native method, and it's typesafe (well again not really, but it's as safe as your example) because System.arraycopy will throw an ArrayStoreException if you try to add something that's not of the same type.