Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在使用java泛型时,如何解决这个通配符捕获问题?_Java_Generics_Bounded Wildcard - Fatal编程技术网

在使用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

我在使用java泛型时遇到了一些问题,特别是在使用通配符捕获时。下面是我所拥有的代码的简化版本,它展示了我所看到的问题。这让我发疯:

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())ActionImpl
实现了
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