私は学校のプロジェクトで取り組んでいます。私は抽象クラスを作成して以来、 "manager"と "ticket salesmen"の2種類のオブジェクトを含むArrayListを作成する必要があります。私はArrayList型の "user"を作成し、そこに "manager"と "ticket salesmen"の両方を格納しましたが、どのようにこれらの2つの型にアクセスできますか?私は "ユーザー"としてリストの各要素にアクセスすることができ、 "マネージャ"または "チケットセールスマン"ではなく、抽象クラスにある属性を取得できます。これらの2つのオブジェクトの属性を取得する方法と、どのようなクラスのインスタンスですか?JavaのArrayListに2種類のオブジェクトを格納する
答えて
あなたはあなたが最初のタイプは、サブクラスであるかどうか確認する必要があり、ユーザ
User obj = new Manager();
User obj2 = new SalesMan();
System.out.println(obj instanceof Manager); // true
System.out.println(obj instanceof SalesMan);// false
System.out.println(obj2 instanceof Manager); // false
System.out.println(obj2 instanceof SalesMan);// true
...キャストはアプリケーションがうまく設計されていない場合にのみ必要です。 –
私は同意します。可能であれば、instanceOfの使用は避けてください。 –
@HenryMaathuisなぜinstanceofを避けるべきですか? –
の実際の型を識別するために、instanceof
演算子を使用することができます。これは、instanceOf演算子を使用して行うことができます。サブクラスの型を決定したら、ユーザーをその特定のサブクラスにキャストする必要があります。キャスト後、その特定のサブクラスの機能にアクセスできます。
ただし、可能な場合はinstanceOfの使用を避ける必要があることに注意してください。 instanceOfの使用を避けるには、このquestionで受け入れられた答えを見てください。
「一般的に悪い習慣」ではないので、あなたの声明は間違っています。それは与えられた文脈でそれを使うのは悪いですが、一般的ではありません。 – Antoniossss
私はあまりにも多くを一般化しました。それが役に立つことができる状況がありますが、実際には特定の状況では避けることができます。 –
arrayListを繰り返し、instanceof
を使用して型をチェックし、次にキャストしてメソッドと属性を使用します。このようなことを試してみてください。
for (User user : arrayList) {
if (user instanceof Manager) {
Manager manager = (Manager) user;
//manager.method();
} else if(list instanceof SalesMan){
SalesMan salesMan = (SalesMan) user;
//salesMan.method();
}
}
代替がgetClass()
を使用してクラスの型を取得するには、次のようになります。
for (Object obj : userArrayList) {
if (obj.getClass().equals(Manager.class)) {
...
}
if (obj.getClass().equals(Salesman.class)) {
...
}
}
instanceofははサブクラスの場合が、この方法でも動作することもに留意しなければならない、それは勝ちました't。
親切にあなたのソリューションのためのリンクの下には、次のとおりです。
https://stackoverflow.com/a/34437757/3095589
は、それはあなたに参考になることができるかもしれない...
を他の答えは完全にあなたが尋ねたものを達成する方法を説明しますがあなたがやろうとしていることは、さまざまな理由でオブジェクト指向設計の悪い習慣と一般的にみなされます。
- カップリング:コードがオブジェクトの型に基づいて決定を下すときには、さらに型を追加するたびに条件付きチェックを追加する必要があります。つまり、
User
の3番目の型です。コードを指数関数的に維持することが難しくなるため、これは悪いことです。追加のサブクラスを追加するときは、特別な動作が必要なコード内のすべての場所を見つける必要があります。言及された場所の1つとコードブレークでもこれを忘れてください。 - instanceofを使用すると、スーパークラスのさまざまなサブクラスを異なる方法で扱う必要があることを意味します。スーパークラスはおそらく最初にスーパークラスになるのに十分な共有機能/データを持たなかったでしょうか?なぜそれらがほとんど特性を共有しない場合、それらを一緒に保存するのですか?
コードの再設計を検討してください。それでもマネージャーとTicketSalesManがユーザーから継承しなければなりませんし、あなたが反復ループ内でそれらにいくつかの操作を実行する必要があると思われる場合は、はメソッドをオーバーライド代わりにinstanceof
を使用することを検討してください。以下のコードを見てください:
public abstract class User
{
public abstract void doOperation();
}
public class Manager extends User
{
public void doOperation()
{
// do stuff that managers do
}
}
public class SalesMan extends User
{
public void doOperation()
{
// do stuff that salesmen do
}
}
public class Main
{
public static final void main(String[] args)
{
ArrayList<User> users = getUsers();
for(User u: users)
{
u.doOperation();
}
}
}
- 1. オブジェクトを格納するのに適したデータベースの種類は何ですか?
- 2. スプレッドシートの種類のデータをSQLデータベースに格納する
- 3. ハッシュの格納に使用するデータ型の種類
- 4. ユーザー入力を格納するJava Arraylist
- 5. 単一のDjangoモデルフィールドに2種類の値を格納します
- 6. R Shiny:入力オブジェクトに入力の種類を格納しますか?
- 7. ArrayListに格納
- 8. 同じ種類のC++テンプレートオブジェクトを格納する
- 9. メッシュに格納できるデータの種類
- 10. ArrayListの種類を比較する
- 11. 異なる種類の変数を格納
- 12. 別の種類のファイルを格納するディレクトリをアプリケーション内に作成する
- 13. Java arraylistにジェネリック型のデータを格納する方法
- 14. Java ArrayListに格納されているオブジェクト値を取得する方法
- 15. オブジェクトに情報を格納するJava
- 16. 異なる種類のオブジェクトを順番に格納し、そのプロパティに従って使用すること
- 17. 反復インスタンス:異なる種類の値を格納するオブジェクト指定されたオブジェクト
- 18. 種類の降格(種類プロモーションとは対照的に)
- 19. 私は、オブジェクトの種類を格納するために使用したいタイプのクラスを持つジェネリック型
- 20. java - arraylistに文字列を格納する
- 21. ArrayListハッシュマップ抽出とarraylistへの格納
- 22. さまざまな種類のベクトルのポインタを格納する方法
- 23. オブジェクト配列をArraylistに格納します。
- 24. 3種類のビットを格納する最も良い方法は?
- 25. バイナリ分類のテキストデータセットを格納する
- 26. 2種類のコンテナ
- 27. 2 else文と2種類の$種類の場合
- 28. Java - タイプセーフな異種コンテナパターンを格納する関数
- 29. 戻る2種類
- 30. アンドロイドに存在するarraylistからarraylistを格納
そのはるかに良い説明 – Antoniossss
よりも実際のコードを貼り付ける私はあなたがtoghether両方のタイプを維持している理由を手始めを求めると思いますか?彼らの共通点は何がありますか ? – Antoniossss
このソリューションのリンクは次のとおりです。https://stackoverflow.com/a/34437757/3095589 –