Java 帮助思考+;建设者

Java 帮助思考+;建设者,java,reflection,constructor,Java,Reflection,Constructor,我有一段代码,我正在处理,以实例化一个依赖于传入多项式的CRC算法,以及一个包含“crc8”、“crc16”或“crc32”的字符串s 类CRC8、CRC16和CRC32都扩展了类CRC,并实现了一个接口HashAlgorithm。它们每个都有一个构造函数CRCx(int多项式) 我的问题是,我在getConstructor()的所有3行上都遇到了这个错误: 类型不匹配: 无法从构造函数转换 建造师 有人能解释一下原因并帮我解决这个问题吗 int polynomial; // assi

我有一段代码,我正在处理,以实例化一个依赖于传入多项式的CRC算法,以及一个包含“crc8”、“crc16”或“crc32”的字符串
s

CRC8
CRC16
CRC32
都扩展了类
CRC
,并实现了一个接口
HashAlgorithm
。它们每个都有一个构造函数
CRCx(int多项式)

我的问题是,我在getConstructor()的所有3行上都遇到了这个错误:

类型不匹配:
无法从构造函数转换
建造师
有人能解释一下原因并帮我解决这个问题吗

    int polynomial; // assign from somewhere
    Constructor<CRC> crc = null;
    if ("crc8".equals(s))
    {
        crc = CRC8.class.getConstructor(Integer.TYPE);
    }
    if ("crc16".equals(s))
    {
        crc = CRC16.class.getConstructor(Integer.TYPE);
    }
    if ("crc32".equals(s))
    {
        crc = CRC32.class.getConstructor(Integer.TYPE);
    }
    if (crc != null)
    {
        CRC crcInstance = crc.newInstance(polynomial);
        return (HashAlgorithm) crcInstance;
    }
int多项式;//从某处指派
构造函数crc=null;
如果(“crc8”。等于)
{
crc=CRC8.class.getConstructor(Integer.TYPE);
}
如果(“crc16”。等于)
{
crc=CRC16.class.getConstructor(Integer.TYPE);
}
如果(“crc32”。等于)
{
crc=CRC32.class.getConstructor(Integer.TYPE);
}
如果(crc!=null)
{
CRC crcInstance=CRC.newInstance(多项式);
返回(哈希算法)crcInstance;
}

尝试如下声明
crc
变量:

Constructor<? extends CRC> crc = null;
Constructor<? extends CRC> crc = null;

Constructor尝试如下声明
crc
变量:

Constructor<? extends CRC> crc = null;
Constructor<? extends CRC> crc = null;

Constructor多亏了泛型的奇迹,
Constructor
Constructor
的类型不兼容。您需要为您的变量选择更一般的选项,如:

Constructor<? extends CRC> crc = null;
Constructor<? extends CRC> crc = null;

Constructor多亏了泛型的奇迹,
Constructor
Constructor
的类型不兼容。您需要为您的变量选择更一般的选项,如:

Constructor<? extends CRC> crc = null;
Constructor<? extends CRC> crc = null;
Constructor试试看

可以通过其他几种方法(例如,将算法的哈希映射到CRC的可复制类等)来实现


它可以通过其他几种方式完成(例如,将算法映射到CRC的可复制类等)。

其他人已经为您的问题提供了解决方案,但我的建议是不要在不需要的地方使用Java反射。使用反射的解决方案通常更慢,代码更复杂,并且通常有更多的“动态类型”失败案例需要考虑。
在您的特定示例中,“对象工厂”模式是比使用反射调用构造函数更好的解决方案。

其他人已经为您的问题提供了解决方案,但我的建议是不要在不需要的地方使用Java反射。使用反射的解决方案通常更慢,代码更复杂,并且通常有更多的“动态类型”失败案例需要考虑。
在您的特定示例中,“对象工厂”模式是比使用反射调用构造函数更好的解决方案。

您使用反射有什么特别的原因吗?嗯,呃,我有一个原因,现在想不起来了。“kd304”很有道理。为什么不使用工厂模式并返回一个新建立的哈希算法呢?然后你会得到编译时检查,它应该运行得更快一些。我想这是因为我有一个相关的例子,我不能用显式创建对象的方式清晰地分离代码。。。但这没有道理……@Steve Kuo:工厂模式在什么意义上?你是说每个HashAlgorithm都有一个单独的工厂,可以根据需要实例化所需的对象吗?你使用反射有什么特别的原因吗?嗯,呃,我有一个原因,现在想不起来了。“kd304”很有道理。为什么不使用工厂模式并返回一个新建立的哈希算法呢?然后你会得到编译时检查,它应该运行得更快一些。我想这是因为我有一个相关的例子,我不能用显式创建对象的方式清晰地分离代码。。。但这没有道理……@Steve Kuo:工厂模式在什么意义上?你是说每个HashAlgorithm都有一个单独的工厂,可以根据需要实例化所需的对象吗。我的评论分别是“哇!真不敢相信我忘了”和“哇”。@Jason S:是的。你现在在学Java吗?你似乎有一大堆来自Java的代表,或者仅仅是一大堆问题?我会说75%的问题,25%的答案。。。在过去的一年左右,我断断续续地学习Java。我是一名电气工程师,而不是软件工程师,偶尔会做数据处理/软件任务,所以我突然需要使用Java并快速学习一些东西,然后在这期间忘记我所学的一半…:/我怀疑。还有一个很好的例子不是关于你在这方面有多好。不过,我想这会给每个人留下这样的印象。顺便说一句,你在等更多的答案吗?呵呵。我的评论分别是“哇!真不敢相信我忘了”和“哇”。@Jason S:是的。你现在在学Java吗?你似乎有一大堆来自Java的代表,或者仅仅是一大堆问题?我会说75%的问题,25%的答案。。。在过去的一年左右,我断断续续地学习Java。我是一名电气工程师,而不是软件工程师,偶尔会做数据处理/软件任务,所以我突然需要使用Java并快速学习一些东西,然后在这期间忘记我所学的一半…:/我怀疑。还有一个很好的例子不是关于你在这方面有多好。不过,我想这会给每个人留下这样的印象。顺便说一句,你在等待更多的答案吗?