我有以下通用界面:
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类对象的情况下实现它?
答案 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.
告诫命令