Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.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_Arguments_Overriding_Polymorphism - Fatal编程技术网

Java 重写方法的多态参数

Java 重写方法的多态参数,java,arguments,overriding,polymorphism,Java,Arguments,Overriding,Polymorphism,我们需要构建一个资源,它可以是两种类型之一:逻辑或物理。对于每个资源子类型,我们都附带了一个配置,它可以是逻辑配置和物理配置 这样做是因为配置对象是可编辑的,需要进行版本控制。例如,资源可以有两个配置版本:活动和草稿。Resource中提供了添加配置的方法addConfiguration(配置配置) 现在,我们面临一个问题,逻辑配置可能会错误地传递给物理资源的添加配置方法 Resource resource = new PhysicalResource() Configuration confi

我们需要构建一个
资源
,它可以是两种类型之一:
逻辑
物理
。对于每个资源子类型,我们都附带了一个
配置
,它可以是
逻辑配置
物理配置

这样做是因为配置对象是可编辑的,需要进行版本控制。例如,资源可以有两个配置版本:活动和草稿。
Resource
中提供了添加配置的方法
addConfiguration(配置配置)

现在,我们面临一个问题,
逻辑配置
可能会错误地传递给
物理资源
添加配置
方法

Resource resource = new PhysicalResource()
Configuration config = new LogicalResourceConfiguration();
physicalResource.addConfiguration(config)
此调用将成功,并将添加错误的配置。可以使用以下方法来避免这种情况

  • 我们执行
    instanceOf
    检查或定义成员
    类型
    ,但这将杀死多态性
  • 我们创建了两个方法
    addLogicalConfiguration
    /
    addPhysicalConfiguration
    其中一个在运行时失败

  • 解决这个问题最合适的方法是什么?或者是否有特定的模式来解决此类问题?

    您可以向资源类添加泛型类型参数:

    class Resource<T extends Configuration> {
        public void addConfiguration(T config) {}
    }
    
    类资源{
    public void addConfiguration(T config){}
    }
    
    然后,您可以:

    class PhysicalResource extends Resource<PhysicalConfiguration> {...}
    
    class LogicalResource extends Resource<LogicalConfiguration> {...}
    
    类物理资源扩展资源{…}
    类LogicalResource扩展资源{…}
    
    此结构应满足您的期望,在尝试将不正确的
    配置
    类型添加到
    资源
    时会出现编译错误:

    abstract class Configuration  {
    }
       class LogicalConfiguration extends Configuration  {
       }
       class PhysicalConfiguration extends Configuration  {
       }
    abstract class Resource<C extends Configuration>  {
       private C config;
       public void addConfiguration(C config)  {
          this.config = config;
       }
       public C getConfig()  {
          return  config;
       }
    }
       class LogicalResource extends Resource<LogicalConfiguration>  {
       }
       class PhysicalResource extends Resource<PhysicalConfiguration>  {
       }
    

    将这些类放入它们自己的包中,并在
    Resource
    中对
    addConfiguration
    进行保护


    这样,任何使用您的软件包的人都会在编写代码时发现错误。

    感谢您提供的通用解决方案,我们将继续这样做,但我们更希望在某些模式或实例中找到一些解决方案,作为这种情况下的一个好的替代方案。
    Resource resource = new PhysicalResource()
    Configuration config = new LogicalResourceConfiguration();
    
    //COMPILATION ERROR:
    physicalResource.addConfiguration(config);