Javaの場合の「抽象」コードと「汎用」コードの違いは何ですか? どちらも同じ意味ですか?
4 に答える
Abstract と Generics は、Java の構文とセマンティクスにおいて完全に異なるものです。
abstract はキーワードであり、クラスに完全な実装が含まれていないため、インスタンス化できないことを示します。
例:
abstract class MyClass {
public abstract void myMethod();
}
MyClass にはメソッド定義 'public abstract void myMethod()' が含まれていますが、実装を指定していません。実装は、通常は具象サブクラスと呼ばれるサブクラスによって提供される必要があるため、抽象クラスは、おそらくいくつかの実装を使用してインターフェイスを定義します。詳細。
ジェネリックの使用は、クラスの側面をパラメーター化できることを示します。最も理解しやすい例は、Java Collections API にあると思います。
たとえばList<String>
、「文字列型のオブジェクトのリスト」として読み取ることができます。List<Integer>
は同じ List インターフェイスですが、Integer 型のオブジェクトのみを受け入れます。
Collections API では、定型文で型をチェックして適切にキャストする必要があるコレクションに型安全性を提供します。
抽象的-具体的な現実、特定のオブジェクト、または実際のインスタンスとは別に考えられます。
Javaでは、クラスとメソッドの定義に抽象という言葉があります。これは、クラスをインスタンス化できない(スーパークラスとしてのみ使用できる)か、メソッドをサブクラスでオーバーライドする必要があることを意味します。この例はAnimalクラスで、Animalはあいまいすぎてインスタンスを作成できませんが、Animalは、Animalクラスで定義する必要のある共通の属性/機能を共有しています。
public abstract class Animal{
protected int calories;
public void feed(int calories){
weight += calories;
}
public abstract void move(); // All animals move, but all do not move the same way
// So, put the move implementation in the sub-class
}
public class Cow extends Animal{
public void move(){
// Some code to make the cow move ...
}
}
public class Application{
public static void main(String [] args){
//Animal animal = new Animal() <- this is not allowed
Animal cow = new Cow() // This is ok.
}
}
属-属、クラス、グループ、または種類のすべてのメンバーの、適用可能、または参照。全般的。
GenericまたはGenericsという用語は、Javaで、コンテナオブジェクトに含まれるオブジェクトのタイプを明示的に宣言するときに使用されます。たとえば、ArrayListを例にとると、任意のオブジェクトをArrayListに入れることができますが、これは簡単にバグにつながる可能性があります(intで埋められたStringを誤ってArrayListに入れる可能性があります)。ジェネリックスはJavaで作成されたため、ArrayListにintのみが必要であることをコンパイラーに明示的に伝えることができます(ジェネリックスを使用すると、整数のArrayListに文字列を挿入しようとするとコンパイラーはエラーをスローします)。
public class Application{
public static void main(String [] args){
ArrayList noGenerics = new ArrayList();
ArrayList<Integer> generics = new ArrayList<Integer>();
nogenerics.add(1);
nogenerics.add("Hello"); // not what we want, but no error is thrown.
generics.add(1);
generics.add("Hello"); // error thrown in this case
int total;
for(int num : nogenerics)
total += num;
// We will get a run time error in the for loop when we come to the
// String, this run time error is avoided with generics.
}
}
短くて理解しやすい答え:
抽象コードはアイデアを表現しますが、それを機能させる方法は表現しません
ジェネリックコードは複数の種類のオブジェクトで機能し、どの種類のオブジェクトを指定したかを認識します
より長いが、テキストの壁ではない:
Abstractは、完全な実装なしでインターフェースを指定します
- 抽象クラスを使用するには拡張する必要があります。コンストラクターを使用してインスタンスを作成することはできません。
- 抽象クラスは、すべてのメソッドにコードを提供する必要はありません。メソッド名、戻り値、およびスローされたチェック済み例外のみを提供できます。
- これは、何かがさまざまな方法で機能できるようにする場合に、抽象メソッドを使用できることを意味します。
例:抽象storeValueメソッドとgetValueメソッドを使用して抽象Storeクラスを作成できます。次に、データベースストレージ、ディスクストレージ、ネットワークストレージ、およびメモリストレージのさまざまな実装で拡張します。storeValueメソッドとgetValueメソッドを除いて、すべて同じメソッドを使用します。それらは交換可能に使用できます。
ジェネリックコードにはタイプ情報が含まれており、複数のタイプで機能する可能性があります。
- ジェネリックスでは、バニラオブジェクトの入力/出力、および多くの「インスタンスの」チェックとオブジェクトのキャストではできないことを実際に行うことはできません。
- ただし、読みやすいです。
- ジェネリックコードは、それが動作するオブジェクトの種類を指定し、同じもののグループを操作できるようにします
- ジェネリックコードを使用すると、アルゴリズムが何で動作しているかを知らなくてもアルゴリズムを指定できます。アルゴリズムが呼び出されると、入力が何であれ、入力と同じタイプを出力できます。
- Genericsを使用してさまざまなオブジェクトタイプを操作する場合は、バニラオブジェクトとの間でキャスト(およびオブジェクトタイプをチェック)する必要はありません。
- ジェネリックスの最も一般的な場所はコレクションの操作です-正確に何であるかを知らなくても、何かのコレクションを保存できます
- ジェネリックは非常に複雑になる可能性があります
例:String(または同様の)オブジェクトを端から端まで追加する、またはNumberオブジェクトを合計する、または1つのタイプの要素をそのタイプを含むコレクションに追加する「add」メソッドを定義します。
抽象は、「完全」と見なされる前に機能の追加定義を必要とするものを定義するために使用されます (または、Java 認定テスト用語の具象)。ジェネリックとは、クラスをインスタンス化するときに定義するさまざまなデータ型を処理できるクラスであることを意味します。