gpt4 book ai didi

java - 如何从实现接口(interface)的泛型类返回接口(interface)?

转载 作者:行者123 更新时间:2023-12-03 09:38:24 24 4
gpt4 key购买 nike

我想做一个接受任何类的方法T实现任何接口(interface)I .
然后对类做点什么,返回接口(interface)I实现。
这是我尝试过的:

class MyLibrary {

public static <I, T extends I> I registerImplementation(Class<T> classImpl) {
I interfaceImpl = (I) classImpl.newInstance();
return interfaceImpl;
}
}
然后我创建一个接口(interface)和一个实现该接口(interface)的类:
interface UserInterface {
void doSomethingDefined();
}

class UserClass_v1_10_R2 implements UserInterface {

@Override
public void doSomethingDefined() {
System.out.println("What this does is well-defined");
}

public void doVersionSpecificStuff() {
System.out.println("This is not in the interface, so don't really depend on this");
}
}
但是,当我调用引用 UserClass 的方法时,它返回相同的类类型 T而不是接口(interface)类型 I ,允许调用所有未在接口(interface)中声明的类方法。
IE。在下面的陈述中,即使 registerImplementation()声明返回对 UserInterface 的引用,编译器将引用视为指向 UserClass_v1_10_R2 的实例,允许访问不在接口(interface)中的实现方法。
MyLibrary.registerImplementation(UserClass_v1_10_R2.class).doVersionSpecificStuff();
将此与所谓的相同
UserInterface uiObj = MyLibrary.registerImplementation(UserClass_v1_10_R2.class);

uiObj.doVersionSpecificStuff(); // This does not compile

最佳答案

这就是编译器推断类型的方式。如果您使用特殊(未记录的)标志进行编译:

javac --debug=verboseResolution=all  ...
你会看到:
  Note: Deferred instantiation of method <I,T>registerImplementation(Class<T>)
MyLibrary.registerImplementation(UserClass_v1_10_R2.class).doVersionSpecificStuff();
^
instantiated signature: (Class<UserClass_v1_10_R2>)UserClass_v1_10_R2
查看实例化的签名: (Class<UserClass_v1_10_R2>)UserClass_v1_10_R2所以你需要添加另一个参数来获取接口(interface):
public static <I, T extends I> I registerImplementation(Class<I> interfaceClass, Class<T> implClass) {
// do whatever checks you want if this is an interface or if a constructor can be called....
I interfaceImpl = null;
try {
interfaceImpl = interfaceClass.cast(implClass.newInstance());
} catch (Exception e) {
e.printStackTrace();
}
return interfaceImpl;
}
当然,如果您有多个接口(interface),这会引发问题,但这是您需要考虑的事情。

关于java - 如何从实现接口(interface)的泛型类返回接口(interface)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65053944/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com