あなたの新しい質問は、実行時に未知の任意の型に変数を動的にキャストする方法を尋ねているようです。これはおそらくjavaの複製です。あるタイプから別のタイプへの変数の動的キャストをどのように行うことができますか?しかし、要約すると、これは(簡単に)不可能であり、推奨されておらず、コード内の他の問題について話します。
このように考えてください。新しくキャストされたオブジェクトを格納するために、どの変数を使用できる可能性がありますか?(child)
Javaでキャスト操作があり、親クラスとして定義された変数を受け取り、それをその子にキャストした場合を想像してみてください(たとえば、List-> LinkedList)。
public static void func(Abstract a){
???? var = (child)a;
// Do something with var?
}
var
1)実行時にどのタイプになるかわからないため、のタイプを指定する方法がないことに注意してください。2)コンパイラは、で使用できるもの以外に使用Abstract
できるメソッドを予測できないため、とにかく定義された動作を超えてvarで実行できることは何もありません。var
Abstract
クラス固有の動作を実装する必要がある場合は、クラス内で実装する必要があります。各クラスが実装する必要があり、必要なことは何でも実行できる抽象メソッドを用意します。または、それを保証できない場合は、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