当前位置: 首页 > 知识库问答 >
问题:

试图实现依赖注入的类错误

年良骏
2023-03-14

我使用泛型使代码可重用,并利用依赖项注入。

我有两个接口:DataParserImplementation和ObjectImplementation。我有实现每个的类:SalesRepbyId实现DataParserImpl(它将数据解析为对象并将这些对象放入集合)。SalesRep实现Objectimpl(它是特定数据集的对象)。

我试图得到它,这样我就可以选择在我的SalesRepbyId类中使用哪种对象,这样我就可以删除耦合。

我知道有一种叫做反射的东西,我被告知这是我需要使用的方法。我还听说过一个“工厂模式”和一个“属性文件”,它允许我做我想做的事情。很多事情都很让人困惑,所以请像我五岁一样解释。

下面是它停止工作的代码:

编辑:基于注释的修订:我希望通过公共接口将数据对象(D)传递给构造函数并使用泛型类型来指定我的类使用的数据对象(D)的类型。当我尝试使用它而不是具体的实现类时,我得到了错误。我找不到关于这个错误的任何信息。

   public class SalesRepbyId<D extends ObjectImplementation> implements DataParserImplementation<Map<String,D>> {
private FileParserImplementation<ArrayList<String[]>> FileParser;
private D dataObject;

public SalesRepbyId(FileParserImplementation<ArrayList<String[]>> FileParser,D d){
    this.FileParser = FileParser;
    this.dataObject = d;
}
@Override
public Map<String, D> Parse() {

    try{
        //reads the file and returns an array of string arrays
        ArrayList<String[]> Salesrep_contactlist =  FileParser.ReadFile;
        //here it still says "Unknown Class." that's the problem
        Map<String, dataObject> SalesrepByIdMap = new HashMap<>();
  //I want to be able to put in any class that implements 
  //dataObject into this class and have it run the same way.

共有1个答案

茅才
2023-03-14

我实现了工厂设计模式,并创建了一个属性文件,该文件允许我在我想要的类中进行反映,而不是尝试使用通用的数据对象(或D)类型。

使用属性文件“config.properties”反映类,然后将其强制转换为类型Objectimplementation,允许我使用实现该接口的任何类(在工厂中实现并在属性文件中设置)。然后我将D的所有实例重构为typeObjectImplementation,因为父接口是这里需要的抽象层,而不是一般的具体类。

泛型D类型不适用于反射的原因是反射使用在运行时确定的具体类样式,并且泛型D类型是在运行时之前指定的。因此,我试图在没有正确使用反射的情况下反映类样式及其方法/实例,代码告诉我,在我需要它的时候,类样式是未知的。

工作代码示例:

public class SalesRepbyId implements 
DataParserImplementation<Map<String,ObjectImplementation>> {
    private FileParserImplementation<ArrayList<String[]>> FileParser;
    //the Factory class that creates instances of the reflected class I wanted
    private ObjectFactory Factory = new ObjectFactory();

    public Map<String, ObjectImplementation> Parse() {
        //the proeprties object which then loads properties from a file and reflects the classtype I want
        Properties prop = new Properties();
        //loading in the classtype and casting it to the subclass of ObjectImplementation that it actually is
        prop.load(SalesRepbyId.class.getResourceAsStream("config.properties"));
        Class<? extends ObjectImplementation> Classtouse = Class.forName(prop.getProperty("ObjectImplementation")).asSubclass(ObjectImplementation.class);
        //construct instances of 'Classtouse' and parse the data into these dynamically typed objects
        //return the map that holds these objects
        }

 类似资料:
  • 本文向大家介绍自学实现angularjs依赖注入,包括了自学实现angularjs依赖注入的使用技巧和注意事项,需要的朋友参考一下     在用angular依赖注入时,感觉很好用,他的出现是 为了“削减计算机程序的耦合问题” ,我怀着敬畏与好奇的心情,轻轻的走进了angular源码,看看他到底是怎么实现的,我也想写个这么牛逼的功能。于是就模仿着写了一个,如果有什么不对,请大家批评指正。     

  • 在React中,想做依赖注入(Dependency Injection)其实相当简单。请看下面这个例子: // Title.jsx export default function Title(props) { return <h1>{ props.title }</h1>; } // Header.jsx import Title from './Title.jsx'; export defa

  • 依赖注入 Dependency Injection is a strong mechanism, which helps us easily manage dependencies of our classes. It is very popular pattern in strongly typed languages like C# and Java. 依赖注入是一个很强大的机制,该机制可以帮

  • 简介 Hyperf 默认采用 hyperf/di 作为框架的依赖注入管理容器,尽管从设计上我们允许您更换其它的依赖注入管理容器,但我们强烈不建议您更换该组件。 hyperf/di 是一个强大的用于管理类的依赖关系并完成自动注入的组件,与传统依赖注入容器的区别在于更符合长生命周期的应用使用、提供了 注解及注解注入 的支持、提供了无比强大的 AOP 面向切面编程 能力,这些能力及易用性作为 Hyper

  • 出自维基百科 Wikipedia: 依赖注入是一种允许我们从硬编码的依赖中解耦出来,从而在运行时或者编译时能够修改的软件设计模式。 这句解释让依赖注入的概念听起来比它实际要复杂很多。依赖注入通过构造注入,函数调用或者属性的设置来提供组件的依赖关系。就是这么简单。

  • 我正在创建一个实现IAnimal接口的Animal类。然后,Cats和Dogs类都实现了IAnimal接口。目前,我在IAnimal中只保留了3个简单的方法,以便进行简短的演示。主要类动物是通过依赖注入(DI)构建的。 当IAnimal有更多的方法时,例如:Cats类只实现SomethingOnlyCatsDo方法,Dogs类实现SomethingOnlyDogsDo方法,那么每个类内部都会有更多