私はJavaでジェネリック関数を書いていますが、ジェネリックオブジェクトが含まれている必要があるクラスのリストを設定する方法があるかどうかはわかりません.
このようなもの:
public static <T in {String.class, Integer.class, Long.class}> Collection<T> test(Collection<T> val);
私はJavaでジェネリック関数を書いていますが、ジェネリックオブジェクトが含まれている必要があるクラスのリストを設定する方法があるかどうかはわかりません.
このようなもの:
public static <T in {String.class, Integer.class, Long.class}> Collection<T> test(Collection<T> val);
たとえば、次のような境界型パラメーターを使用できます。
public static <T extends String & Runnable> Collection<T> test(Collection<T> val);
ただし、いくつかのクラスがあり、Java は多重継承をサポートしていないため、この例は機能しません。
また、あなたの例はそうであるためString
、とにかく拡張することはできません。Integer
Long
final
いいえ、Java ではできません。
あなたが望むのは「OR」バウンドです。Java では「AND」境界を使用できます。たとえば、次のようになります。
List<T extends Runnable & Comparable<T>>
ただし、類似の「OR」はサポートされていません。
List<T extends Integer | String> // doesn't compile
考えてみれば、何の意味もありません。タイプ バウンドごとに個別のクラス/メソッドを使用します。
残念ながら、Java でやろうとしていることを行うことはできません。リストからジェネリックを指定できる場合は、Integers または ArrayLists のいずれかで動作する関数を作成できますが、これは次のようには意味がありません。共通の機能を共有していません。メソッドを特定の型に制限したい場合は、必要な機能をサポートすることから継承する基本クラス/インターフェースを見つけるか ( public static <T extends BaseClass> Collection<T> test(Collection<T> val);
)、サポートしたい型ごとに 1 つずつ、オーバーロードされたメソッドのセットを記述します。
まあ、できることとできないことは同時にあります。
あなたの特定の例では、それは不可能です。
しかし、そのような例は機能します:
public <T extends CharSequence & Comparable & Closeable> void go(){
あなたの場合、私は次のようにします:
public <T extends Number & CharSequence> void go() // same rule applies as extend a class and implement as many interfaces as you want
それをしてはいけない。ジェネリックは、型の安全性を強制するためだけのものです (型が特定のメソッドを実行できることなどを保証します)。このような「OR」境界に対応するタイプ セーフ要件はありません。型の安全性に関する要件では、「AND」境界のみが必要です。