Java 需要帮助以避免类型转换吗

Java 需要帮助以避免类型转换吗,java,generics,Java,Generics,我需要帮助重构下面的代码。我想在这段代码中解决两个主要问题 1.规则1实现中的不安全类型转换 2.太多接口的实现 public interface Rule { public void execute(DataProvider dataProvider); } public interface DataProvider { // No common functions as of now } public interface Rule1dataPro

我需要帮助重构下面的代码。我想在这段代码中解决两个主要问题 1.规则1实现中的不安全类型转换 2.太多接口的实现

  public interface Rule {
     public void execute(DataProvider dataProvider);
  }

  public interface DataProvider {
     // No common functions as of now 
  }

  public interface Rule1dataProvider extends DataProvider {
     // Functions required by Rule1
  }

  public class Rule1 implements Rule {
     public void execute(DataProvider dataProvider) {
       ADataProvider rule1DataProvider = <ADataProvider>dataProvider;
       // Other logic 
    }
  }

 public class EntityADataProvider implements Rule1DataProvider, Rule2DataProvider... {
    // Overrides functions of Rule 1 and Rule2 
 }
公共接口规则{
public void execute(数据提供者数据提供者);
}
公共接口数据提供者{
//目前还没有通用的功能
}
公共接口规则1数据提供程序扩展数据提供程序{
//规则1所要求的职能
}
公共类Rule1实现该规则{
public void execute(数据提供程序数据提供程序){
ADataProvider rule1DataProvider=数据提供者;
//其他逻辑
}
}

公共类EntityAdatProvider实现Rule1DataProvider、Rule2DataProvider。。。{ //覆盖规则1和规则2的功能 }
我试图在这里使用泛型,但无法找到正确的方法来使用它们以消除类型转换

使规则通用:

public interface Rule<T extends DataProvider> {
    public void execute(T dataProvider);
}
公共接口规则{
公共无效执行(T数据提供程序);
}
然后

public class Rule1 implements Rule<Rule1dataProvider> {
    @Override
    public void execute(Rule1dataProvider dataProvider) {            
        // ...
    }
}
公共类规则1实现规则{
@凌驾
public void execute(Rule1dataProvider dataProvider){
// ...
}
}
使规则通用:

public interface Rule<T extends DataProvider> {
    public void execute(T dataProvider);
}
公共接口规则{
公共无效执行(T数据提供程序);
}
然后

public class Rule1 implements Rule<Rule1dataProvider> {
    @Override
    public void execute(Rule1dataProvider dataProvider) {            
        // ...
    }
}
公共类规则1实现规则{
@凌驾
public void execute(Rule1dataProvider dataProvider){
// ...
}
}


类型转换有什么问题?@HotLicks可能是错误prone@SilviuBurcea-生活容易出错。如果没有类型转换,你就不可能实现OO编程。@HotLicks我同意,但这并不意味着你不应该努力避免类型转换。@SilviuBurcea-那么,你如何避免类型转换呢?泛型并没有回避它,它们只是把它隐藏在一堆难以理解的垃圾中。类型转换有什么问题吗?@HotLicks可能是错误的prone@SilviuBurcea-生活容易出错。如果没有类型转换,你就不可能实现OO编程。@HotLicks我同意,但这并不意味着你不应该努力避免类型转换。@SilviuBurcea-那么,你如何避免类型转换呢?泛型无法避免它,它们只是将它隐藏在一堆难以理解的垃圾中。我尝试过这样做,但找不到从EntityAdatProvider获取rule1DataProvider实例的好方法。我该怎么做?我需要这个,因为规则1可以被不同的实体访问,比如EntityA和EntityB。在这种情况下,我应该以某种方式从实体中派生Rule1DataPRovider相应的数据提供程序SentityAdapProvider实现Rule1DataPRovider,因此它已经是Rule1DataPRovider了。您可以将其传递给
rule1.execute()
。非常感谢。请帮我回答下面的问题-注意,这并不能避免类型转换。它只是隐藏了它。我尝试过这样做,但找不到从EntityADataProvider获取rule1DataProvider实例的好方法。我该怎么做?我需要这个,因为规则1可以被不同的实体访问,比如EntityA和EntityB。在这种情况下,我应该以某种方式从实体中派生Rule1DataPRovider相应的数据提供程序SentityAdapProvider实现Rule1DataPRovider,因此它已经是Rule1DataPRovider了。您可以将其传递给
rule1.execute()
。非常感谢。请帮我回答下面的问题-注意,这并不能避免类型转换。它只是隐藏了它。