これはキャストです。変数が、コンパイル時に認識しているよりも具体的な型である可能性があることをJavaに伝えています。これには、実行時に確実にそのタイプであることを確認する必要があるという点で、ある程度の危険が伴います。そうしないと、例外がスローされます。
これは、ジェネリックが導入される前に、特にコレクションで広く使用されていました。ただし、ジェネリックはコンパイル時により高度な型定義を提供するため、多くのキャストは不要になります。リストからアイテムを取得するときにキャストが必要であることがわかった場合は、おそらくジェネリック型を適切に宣言していない (またはまったく宣言していない) ため、これを修正することを検討する必要があります。
次のコードでは、ジェネリックを使用せずに古い構文を使用しています。コンパイラはリストの型について何も知らないため、最後の行がコンパイルされないことに注意してください。そのため、型は常にオブジェクトです。したがって、それを機能させるにはキャストが必要です。
List list = new ArrayList();
list.add("hello");
String s = list.get(0); //Doesn't compile
String s = (String)list.get(0); //Does compile
このアプローチは現在推奨されておらず、実際には下位互換性の理由からのみ許可されています (ジェネリックが導入される前は、これが唯一の方法でした)。文字列ではないものがリストに入った場合、それを止めるものは何もありません。次の例では、ジェネリックを使用しているため、キャストを廃止しています。
List<String> list = new ArrayList<String>();
list.add("hello");
String s = list.get(0);
このアプローチでは、リストに入れたりリストから取り出したりするものはすべて文字列であることが保証されます。それ以外の場合、コードはコンパイルされません。