根据泛型类型创建对象

时间:2018-05-18 20:28:16

标签: java generics

我有以下通用界面:

public interface I<T> {
  void method(T key);
}

它由两个不同的类(A y B)实现。

public class A implements I<Integer> {
  @Override
  void method(Integer key) {
    //do smth
  }

public class B implements I<String> {
  @Override
  void method(String key) {
    //do smth 
  }

此外,还有一个Java类MyClass,根据T参数创建一个新的A或B实例。

public class MyClass<T> {
  public void f() {
    I<T> object = //here is the problem
  }
}

我的问题如下:

是否可以在不传递T类对象的情况下实现它?

2 个答案:

答案 0 :(得分:1)

通过供应商。

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);

答案 1 :(得分:0)

没有。你必须有一些具体的东西来消除实例化的歧义。记住,在运行时,通用绑定已经消失(它们只是语法糖)。如果你怀疑这一点,请使用和不使用通用提示编译相同的代码。输出类将按字节顺序相同。

你基本上必须有“对某个类型的一些具体引用”,或者由上面的Igor提供,或者其他东西(Class.forName(“ClassName”),ClassName.class等)或通过动态构建一个类java.lang.reflect.Proxy。

Igor的例子只是创建一个匿名工厂作为lambda,但最后,他仍然将引用传递给一个类,用工厂方法包装,并绑定为lambda。

现在你可以“做”,如果你想传递Class,你可以改变你的绑定或类似的东西,并传递一个Class引用用于实例化。然后你可以做类似

的事情
_pass_in_ref.newInstance();
_pass_in_ref::new
etc.
告诫命令