0

私は変数を持っています:Abstract a。クラスを拡張するAbstractクラスです。ただし、このAbstract変数を、クラスを拡張するより具体的なクラス変数にキャストする必要がありAbstractます。

私の状況:私には2つのクラスがClass1あり、どちらもそれぞれに実装されたメソッドでクラスをClass2拡張しています。Abstractこれで、操作するAbstractクラス変数ができました。Class1かどうかわからないClass2ので、単純にa(Class1) aやa (Class2) a(キャスティング)はできません。

では、内部メソッドを使用できるように、この変数を正常にキャストするにはどうすればよいでしょうか。

a.getClass().getName()キャストの仕方を決めるのに使ってみようと思っていたのですが、これから先は行き詰まります。

4

3 に答える 3

1

あなたの新しい質問は、実行時に未知の任意の型に変数を動的にキャストする方法を尋ねているようです。これはおそらくjavaの複製です。あるタイプから別のタイプへの変数の動的キャストをどのように行うことができますか?しかし、要約すると、これは(簡単に)不可能であり、推奨されておらず、コード内の他の問題について話します。

このように考えてください。新しくキャストされたオブジェクトを格納するために、どの変数を使用できる可能性がありますか?(child)Javaでキャスト操作があり、親クラスとして定義された変数を受け取り、それをその子にキャストした場合を想像してみてください(たとえば、List-> LinkedList)。

public static void func(Abstract a){
    ???? var = (child)a;
    // Do something with var?
}

var1)実行時にどのタイプになるかわからないため、のタイプを指定する方法がないことに注意してください。2)コンパイラは、で使用できるもの以外に使用Abstractできるメソッドを予測できないため、とにかく定義された動作を超えてvarで実行できることは何もありません。varAbstract

クラス固有の動作を実装する必要がある場合は、クラス内で実装する必要があります。各クラスが実装する必要があり、必要なことは何でも実行できる抽象メソッドを用意します。または、それを保証できない場合は、Abstractを引数として取る関数を定義しないでください。Class1代わりに、次のようにClass2、、などのオブジェクトをパラメータとして受け取る多くの関数を定義します。

すべての子クラスが同様に動作することを要求する抽象メソッド

public abstract class Abstract{
  /** Do the class-specific behavior you want to do currently in func */
  public abstract void operation();

  public static void func(Abstract a){
    a.operation();
  }
}

実際に必要なものを処理できるクラス専用の関数

public static void func(Class1 a){
  // do something
}

public static void func(Class2 a){
  // do something
}

繰り返しになりますが、これらのオプションのどちらも実行可能でない場合(そしてもちろん、instanceof呼び出しのブロックは受け入れられません)、Javaの使用方法に根本的に正しくない構造的なものがある場合は、お金を賭けてもかまいません。チャイルドキャスティングによって達成しようとしていることの正確なコードサンプルを投稿したい場合は、問題が何であるかを明らかにすることができます。


後世のためにこれをここに残します-OPの元の質問は、その抽象的な親としてキャストされたオブジェクトの新しいインスタンスを作成することについて尋ねました。

非常に簡単で、オブジェクトのクラスオブジェクトを取得し、新しいインスタンスを作成します。より複雑なコンストラクターについては、新しいインスタンスの動的な作成に関するJavaのドキュメントを参照してください。

public class ClassVar
{
    public static abstract class Abstract
    {

    }

    public static class Class1 extends Abstract
    {

    }

    public static class Class2 extends Abstract
    {

    }

    /**
     * Given an instance of a child of Abstract, returns a new instance
     * of the same class
     */
    public static Abstract newInstance(Abstract obj) throws InstantiationException, IllegalAccessException
    {
        return obj.getClass().newInstance();
    }

    public static void main(String[] args) throws InstantiationException, IllegalAccessException
    {
        System.out.println(newInstance(new Class1()).getClass());
        System.out.println(newInstance(new Class2()).getClass());
    }
}

結果:

class ClassVar$Class1
class ClassVar$Class2
于 2012-07-14T18:03:02.590 に答える
0

基本的にはリフレクションを使用して使用できます

クラスcl=..。

cl.newInstance()

あなたがここで見つけることができるより「拡張された」答え

于 2012-07-14T17:58:06.260 に答える
0

執筆時点で3時間前に質問を再度編集したので、これが解決したと思った問題に対する2番目の回答です。そもそも、あなたが本当に求めているものを誰も手に入れていないのは明らかです。質問の仕方を改善してみてください。
ただし、答えは簡単です。

  • オブジェクト指向の観点からは、そうする必要はありません(リスコフの置換原則)。考えられる2つのインスタンスについて正確な知識がある場合でも、モデル化しようとしている問題に対してより適切なアプローチを探す必要があります。

  • 必要に応じて、クラス名を判別して等しいかどうかを確認するか、追加の識別子を付けて比較します。実装はこれ以上簡単ではありません。

于 2012-07-15T20:24:43.053 に答える