質問: new UserA(); // -> error: incompatible types: UserA cannot be converted to T } } ``` としてみてもエラーとなったため、質問した次第です。
回答: 代入の場合は、 extends ではなく super を用いる必要があるはずです。 そして、もう少し調べました。 例えば、今回のケースで言えば、以下のようなことが、ひとまずやれたらいいな、と思うことかもしれません: ``` class Hoge {} class Test { Test() { T hoge = new Hoge(); } } ``` しかし、その実、これはコンパイルが通りません。参考: これは、 java の generics は、コンパイルした直後に generics 情報が消えることと関係していると思います。このコードをコンパイルしようとしたとき、その型的な制約は、「T は任意の Hoge の上位クラスたちすべてに対して成立するようなコードのみを許可する。つまり、メソッドコールであれば Hoge の上位クラスがすべて持っているようなメソッドに限るし、代入であれば Hoge の上位クラスすべてが代入可能な型に対してのみ代入されなければならない」です。 これは、結果として何がおこるかというと、それって T はひとまず Object として取り扱ってこの file をコンパイルしてしまうのと、できることはまったくかわらなくなります。なので、 class に対するジェネリクスを定義する際に、 super 制約は付ける意味がない、だからいらない。禁止。という論理だと思っています。 追記された条件でしたら、私だったら、以下のようにすると思います。 * AppBase に abstract な T を返す createUser メソッドを追加 * 各 個別 App で createUser 実装