キャスト→型マッチング

型マッチングを構文に含めば*1ダウンキャストを無くせるような気がする。

  if( object instanceof TypeA){
    TypeA objectAsTypeA = (TypeA) object;
    // do Something.
  } else if( object instanceof TypeB){
    TypeB objectAsTypeB = (TypeB) object;
    // do Something.
  } else {
    // do Something.
  }

↓コード量が減ると同時に意味付けが明確になった。

  matchingWithType(object){
    TypeA:{
      // do Something.
    }
    TypeB:{
      // do Something.
    }
    default:{
      // do Something.
    }
  }

*1:別に構文である必要はないか。