gpt4 book ai didi

Java泛型方法参数传递问题

转载 作者:搜寻专家 更新时间:2023-11-01 01:46:31 25 4
gpt4 key购买 nike

我在将参数传递给通用方法时遇到问题。代码如下:

public class View<T extends View<T,PM>, PM extends Source>  {

protected PM source;
protected EventManager<T, PM> eventManager;

public View(PM s){
this.source = s;
eventManager = new EventManager<T, PM>();
eventManager.setTarget(this); //error: "The method setTarget(T) in the type
//EventManager<T,PM> is not applicable for the arguments (View<T,PM>)"

eventManager.setSource(s);
}

public void setBinding(Topic topic, IEventAction<T,PM> action){
eventManager.setEventAction(topic, action)
}

}

/**
* EventManager class has to remain completely generic. The type parameters cannot "extends"
* anything because the EventManager is used also in other parts where T and S will have to be
* classes other than "View" and "Source"
*/
public class EventManager<T, S> {
protected T target;
protected S source;
private LinkedHashMap<Topic, IEventAction<T, S>> eventActions;

public EventManager(T target, S source){
this.target = target;
this.source = source;
}

public void setTarget(T target){
this.target = target;
}

public void setSource(S source){
this.source = source;
}

public void setEventAction(Topic topic, IEventAction<T, S> action) {
//some code here ...
omissis...

eventActions.put(topic, action);

omissis...
}

//other methods down here...omissis
}

Eclipse 给出了我在“eventManager.setTarget(this);”行的注释中输入的错误。我不明白为什么它会给我这个错误。无论如何,我找到了一个解决方案(显然),但我不确定我是否做了“干净”或“肮脏”的事情。解决方案是这样的:

 eventManager.setTarget((T)this);

但它给了我一个警告:“类型安全:未检查从 View 到 T 的转换”。为了消除警告,我还将以下内容放在构造函数方法之上:

@SuppressWarnings("unchecked")

它似乎有效,但有什么问题?你有另一个“更清洁”的解决方案(如果存在的话)吗?您认为这是一种“肮脏”的做法吗?

非常欢迎任何建议。

最佳答案

错误的发生是因为您正在使用 T 实例化 EventManager,它可以是运行时 View 的任何子类,但您传递的正是 View(在编译时已知)。由于通常在需要子类时不能传递父类(super class),因此您的代码无法编译。

解决方案(不更改代码)当然是将父类(super class)转换为子类(这就是您正在做的)并尽量不要获得 ClassCastException。

如果你确定你永远不会传递不兼容的类型,那么我猜没关系(尽管很困惑)。也许尝试以某种方式重新设计它。

关于Java泛型方法参数传递问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8417957/

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