Java でメソッドのスコープ内に型変数を導入することは可能かどうか疑問に思っています。つまり、メソッド本体内でスコープを制限します。
ただし、問題を抽象的に説明しようとするのではなく、具体的な問題で説明しましょう。次のようなクラスがいくつかあります。
public class Settings {
public static abstract class Setting<T> {
public T value;
public abstract T fallbackvalue();
}
private final List<Setting<?>> settings;
}
Settings
ここで、すべての設定の値を、抽象メソッドによって提供されるフォールバック値に設定するための関数を に書きたいと思います。私の最初の考えは、次のようにすることです:
public void reset() {
for(Setting<?> setting : settings)
setting.value = setting.fallbackvalue();
}
しかし、考え直してみると、なぜこれが機能しないのかは明らかです。setting.valueの のキャプチャは、 のキャプチャと<?>
同じではありませんsetting.fallbackvalue()
。したがって、キャプチャを統合する方法が必要です。次のように解決できます。
private static <T> void reset1(Setting<T> s) {
s.value = setting.fallbackvalue();
}
public void reset() {
for(Setting<?> setting : settings)
reset1(setting);
}
の明示的な型変数はキャプチャを便利<T>
にreset1
統一しますが、型システムを満たすためだけにこの関数を導入し、名前空間を汚染し、画面を乱雑にし、コードを読みにくくすることは、明らかに世界で最も醜いことです。
の本体内でこれを行う方法はありませんreset
か? 私がやりたいことは、単に次のようなものです:
public void reset() {
for(Setting<?> setting : settings) {
<T> {
Setting<T> foo = setting;
foo.value = foo.fallbackvalue();
}
}
}
それは世界で最も美しいものではありませんが、少なくとも私の目には、上記の変種よりもはるかに負担が少ない. 残念ながら、それは不可能です。しかし、何が可能ですか?