gpt4 book ai didi

java - 通用对象参数的类型问题

转载 作者:行者123 更新时间:2023-11-29 08:26:29 24 4
gpt4 key购买 nike

我有一个抽象类,

public abstract class WebserviceIntegration {
//...
}

在很多类中使用,像这样

public class Manager extends WebserviceIntegration {
//...
}

现在我已经构建了一个类,它将抽象类作为通用参数获取为 F参数,里面有一个方法:

public class NewUserWindow<T, F extends WebserviceIntegration> extends Window {

public NewUserWindow(T objOne, F objTwo) {
//...
saveConnectedBean(objTwo); //no problems here
}

public void saveConnectedBean(F bean) throws MyException{
//...
}
}

Ofc 如果我创建一个新窗口,一切都很好 NewUserWindow<?, Manager> window = new NewUserWindow<>(new OtherClass(), new Manager());然后我保存传递给窗口的 bean。

现在我想做的是保存一个 Manager在构造函数中:

public NewUserWindow(T objOne, F objTwo) {
//...

Manager manager = new Manager();
//... setting manager stuff

saveConnectedBean(manager); //does not compile
}

编译器现在阻止我说 saveConnectedBean(F) in NewUserWindow cannot be applied to (my.package.path.Manager) .如果我用

改变它
saveConnectedBean((F)manager);

它可以编译,但会警告我未检查转换。

  1. 在第一种情况下,为什么编译器不知道我的 Manager类正在扩展 WebserviceIntegration , 这使得它与 F 兼容上课?

  2. 在第二种情况下,我如何进行安全转换?我无法用 manager instanceof F 检查,那我该怎么办呢?

谢谢

最佳答案

不是很清楚,但根据您的问题,我认为失败的代码位于泛型类的构造函数中。

1) 编译器考虑你对 F 的调用在泛型类中声明编译器不知道 F 的确切类型.不要忘记泛型只是编译产物。
因此,如果在构造函数中实例化 Manager变量如:

Manager manager = new Manager();

但是你声明了你的通用类型,比如 NewUserWindow<?, OtherSubClass> window = ...它会破坏类型安全。

2) 避免 instanceof在通用类中。它以某种方式破坏了通用目的。

作为替代方案,您应该传递 Manager来自通用实例的客户端,例如:

Manager manager = new Manager();
NewUserWindow<?, Manager> newUserWindow = new NewUserWindow<>(new ..., manager);
newUserWindow.saveConnectedBean(manager);

来自您的评论:

Let's say I can't run across solution 2, is there any other way for safe casting?

您可以通过执行 NewUserWindow 来做到这一点一个抽象类,声明为抽象一个返回 F 的方法.

public abstract class NewUserWindow<T, F extends WebserviceIntegration> extends Window {

public NewUserWindow(T objOne, F objTwo) {

F f = createF();
saveConnectedBean(f);
}

public abstract F createF();

public void saveConnectedBean(F bean) throws MyException{
//...
}
}

并实现它,例如:

public ManagerUserWindow extends NewUserWindow<T, Manager> extends Window {

public Manager createF(){
return new Manager();
}

}

关于java - 通用对象参数的类型问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52439177/

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