在使用java泛型时,如何解决这个通配符捕获问题?
我在使用java泛型时遇到了一些问题,特别是在使用通配符捕获时。下面是我所拥有的代码的简化版本,它展示了我所看到的问题。这让我发疯:在使用java泛型时,如何解决这个通配符捕获问题?,java,generics,bounded-wildcard,Java,Generics,Bounded Wildcard,我在使用java泛型时遇到了一些问题,特别是在使用通配符捕获时。下面是我所拥有的代码的简化版本,它展示了我所看到的问题。这让我发疯: public class Task { private Action<ActionResult, ? extends ActionSubject> action; private ActionSubject subject = new ActionSubjectImpl(); private List<ActionRe
public class Task {
private Action<ActionResult, ? extends ActionSubject> action;
private ActionSubject subject = new ActionSubjectImpl();
private List<ActionResult> list = new ArrayList<>();
public static void main(String[] args) {
Task task = new Task();
task.setAction(new ActionImpl());
task.doAction();
}
public void setAction(Action<ActionResult, ? extends ActionSubject> action) {
this.action = action;
}
public void doAction() {
list.add(action.act(subject));
}
public static class ActionResult { }
public interface Action<T, U> {
public T act(U argument);
}
public interface ActionSubject {
public String getName();
}
public static class ActionImpl implements Action<ActionResult, ActionSubjectImpl>{
@Override
public ActionResult act(ActionSubjectImpl argument) {
// Code that requires ActionSubjectImpl specifically instead of the interface.
// This classes implmentation of action should only support ActionSubjectImpl as an
// argument.
return new ActionResult();
}
}
public class ActionSubjectImpl implements ActionSubject {
@Override
public String getName() {
return "I am a subject";
}
}
}
我可以从其他帖子中看到,助手方法被建议作为一种使类似的事情起作用的方法,但我还没有想出一个有效的方法
Action-Action
具有如下类型参数:Action
和我传递给act
方法的ActionSubject
是接口类型“ActionSubject”和具体类型“ActionSubjectImpl”,尽管所讨论的代码片段不会看到课程的具体类型。Action
的第二个类型参数应该支持扩展ActionSubject
的任何类型,当我将Action
设置为newactionimpl()
时,第二个类型是ActionSubjectImpl
如果您能就我在泛型定义和使用中的错误发表意见,我将不胜感激。我可能缺少一些基本的东西。我可以用另一种方式编写代码,但在我了解出了什么问题之前,我将无法继续
谢谢。这是你的误解:你说:
Action
的第二个类型参数应支持扩展ActionSubject
这是不对的。Action
的第二个类型参数被限制为ActionSubject
的特定子类,例如MyActionSubject
。因此,您不能传入任意的ActionSubject
实例,因为这是一种更通用的类型
如果您想拥有任意子类型的
ActionSubject
,只需使用ActionSubject
作为第二个类型参数,而不是?扩展ActionSubject
您好。如果我这样做task.setAction(newActionImpl())由于myActionImpl
实现了Action
可能需要将字段设置为私人操作,因此代码>无法将ActionImpl转换为操作代码>?或者使用任务
并使其成为私人行动代码>?我不知道在编译时(在任务中)将使用哪个Action
实现,因此将使用哪个ActionSubject
实现,因此第一个选项是不可行的-我只在这里嵌入ActionSubjectImpl
来演示。但是第二个选项很有趣——它适用于我的代码示例。我将用我的真实代码测试它,如果这是好的,我会将其标记为已回答。谢谢
incompatible types: ActionSubject cannot be converted to CAP#1
where CAP#1 is a fresh type-variable:
CAP#1 extends ActionSubject from ? extends ActionSubject