[解決済み] パラメータ型のオブジェクトのインスタンス化
2022-02-12 20:54:55
質問
以下のようなテンプレートクラスがあります。
class MyClass<T>
{
T field;
public void myMethod()
{
field = new T(); // gives compiler error
}
}
私のクラスでTの新しいインスタンスを作成するにはどうすればよいですか?
どのように解決するのですか?
タイプ消去の後、わかっていることはすべて
T
のサブクラスであるということです。
Object
. のインスタンスを作成するためのファクトリを指定する必要があります。
T
.
1つのアプローチとして
Supplier<T>
:
class MyClass<T> {
private final Supplier<? extends T> ctor;
private T field;
MyClass(Supplier<? extends T> ctor) {
this.ctor = Objects.requireNonNull(ctor);
}
public void myMethod() {
field = ctor.get();
}
}
使い方は以下のような感じです。
MyClass<StringBuilder> it = new MyClass<>(StringBuilder::new);
あるいは
Class<T>
オブジェクトを作成し、リフレクションを使用します。
class MyClass<T> {
private final Constructor<? extends T> ctor;
private T field;
MyClass(Class<? extends T> impl) throws NoSuchMethodException {
this.ctor = impl.getConstructor();
}
public void myMethod() throws Exception {
field = ctor.newInstance();
}
}
関連
-
[解決済み】エラー。Selection does not contain a main type
-
[解決済み】Javaの未処理例外について
-
[解決済み] SomeType@2f92e0f4」を取得せずにJavaオブジェクトを印刷するにはどうすればよいですか?
-
[解決済み] Javaでパラメータの型の横にある3つの点は何を意味するのですか?
-
[解決済み] Javaはパラメータのデフォルト値をサポートしていますか?
-
[解決済み] List<T>をオブジェクトのプロパティでソートする方法
-
[解決済み] Eclipseが起動できない - Javaは起動したが終了コード=13を返した
-
[解決済み] Typeから新しいオブジェクトのインスタンスを作成する方法
-
[解決済み] 汎用型Tのクラスインスタンスを取得する方法を教えてください。
-
[解決済み] テンプレート型のC#ジェネリックnew()への引数の渡し方
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】リンクリストの負の値の数でnegativeCntrを代入する
-
[解決済み】このコンパイルユニットは名前付きモジュールに関連しているため、名前付きパッケージeclipseを宣言する必要があります。
-
[解決済み】代入の左手は必ず変数 CharAt
-
[解決済み】「'void' type not allowed here」エラーの原因とは?
-
[解決済み】Android Studioでタスク :app:compileDebugJavaWithJavac の実行に失敗しました。
-
[解決済み】"|="の意味は何ですか?(パイプ等号演算子)
-
[解決済み】Javaクラスの "型に解決できない"
-
[解決済み] 二項演算子「&」のオペランド型がおかしい java
-
[解決済み] メソッドがそのスーパークラスのメソッドをオーバーライドしない
-
[解決済み】Ubuntu: OpenJDK 8 - パッケージを見つけることができません。