総称型のインスタンスを与える場合、当たり前だが総称型のクラスは認識できる。
public class Some<T> { private Class<T> genericClass; public Some(T t) { genericClass = t.getClass(); }
このようにコンストラクタで T インスタンスを渡すのではなく、渡さずに genericClass を求めたい。
つまり、
Some<Foo> some = new Some<>();
でも、総称型のクラスを、Some 内部だけの実行範囲で認識したい。(めちゃくちゃな要求だとは思う)
可変長引数のコンストラクタにすることで、解決する。
public class Some<T> { private Class<T> genericClass; @SuppressWarnings("unchecked") public Some(T...t) { genericClass = (Class<T>)t.getClass().getComponentType(); }
可変長引数のコンストラクタが気にいらず、インスタンス取得を static メソッドから
生成するようにして、可変長引数のコンストラクタを private コンストラクタにすれば、
利用する側で、可変長引数として使用しないからと思うが、
その方法では、うまくいかず、java.lang.Object しか認識できない。</b>
ダメな方法!!
↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
public class Some<T> { private Class<T> genericClass; @SuppressWarnings("unchecked") private Some(T...t) { genericClass = (Class<T>)t.getClass().getComponentType(); } @SuppressWarnings("unchecked") public static <T> Some<T> getInstance() { return new Some<>(); }