Java 根据泛型类型创建对象

Java 根据泛型类型创建对象,java,generics,Java,Generics,我有以下通用接口: public interface I<T> { void method(T key); } 公共接口I{ 无效方法(T键); } 它由两个不同的类(A、y、B)实现 公共类A实现I{ @凌驾 void方法(整数键){ //做smth } 公共B类工具I{ @凌驾 void方法(字符串键){ //做smth } 此外,还有一个Java类MyClass,其中根据T参数创建了a或B的新实例 public class MyClass<T> { p

我有以下通用接口:

public interface I<T> {
  void method(T key);
}
公共接口I{
无效方法(T键);
}
它由两个不同的类(A、y、B)实现

公共类A实现I{
@凌驾
void方法(整数键){
//做smth
}
公共B类工具I{
@凌驾
void方法(字符串键){
//做smth
}
此外,还有一个Java类MyClass,其中根据T参数创建了a或B的新实例

public class MyClass<T> {
  public void f() {
    I<T> object = //here is the problem
  }
}
公共类MyClass{
公共空间f(){
I object=//问题出在这里
}
}
我的问题如下:

是否可以在不通过T类对象的情况下实现此目标?

通过供应商

class MyClass<T> {
    public void f(Supplier<I<T>> supplier) {
        I<T> object = supplier.get();
    }
}

new MyClass<String>().f(B::new);
new MyClass<Integer>().f(A::new);
class-MyClass{
公开作废f(供应商){
I object=supplier.get();
}
}
new MyClass().f(B::new);
new MyClass().f(A::new);

否。您必须有具体的东西来消除实例化的歧义。请记住,在运行时,泛型绑定已经消失(它们只是语法糖)。如果您对此有疑问,请编译相同的代码,并使用和不使用泛型提示。输出类将按字节相同

基本上,您必须拥有“对类型的一些具体引用”,如上面Igor所示,或者其他内容(Class.forName(“ClassName”)、ClassName.Class等),或者通过java.lang.reflect.Proxy动态构建一个类

Igor的示例只是创建了一个匿名工厂作为lambda,但最终,他仍然将引用传递给一个类,封装在工厂方法中,并作为lambda绑定

现在,您可以做一些事情,如果您想传递类,您可以将绑定更改为或类似的内容,并传递一个类引用以用于实例化

_pass_in_ref.newInstance();
_pass_in_ref::new
etc.

当然,真正的问题是为什么要这样构造代码。将一个
I
作为参数传递给
MyClass
的方法
f()
,甚至传递给它的构造函数。这会将问题转移到更适合解决它的地方。
_pass_in_ref.newInstance();
_pass_in_ref::new
etc.