0

我目前正在使用 Weka 编写一个构建模型的程序(使用 Weka 中包含的各种模型类型之一)。我遇到问题的部分是我想允许程序对同一功能使用多种类型。例如,如果我选择使用 J48 决策树,我需要在 J48 类型的变量上构建和调用函数。另一方面,如果我想使用 BayesNet,我需要在 BayesNet 类型的变量上构建和调用相同的函数。这个模型需要在程序的不同点使用,所以一个简单的 if-else 链是行不通的。

基本上我需要的是相当于 C++ 中的 void 指针。可以采用各种类型的东西,它们都可以执行类似的功能。我尝试使用通用 Object 类,但发现它无法转换为正确的类型(我收到“不兼容的类型”错误)。

所以,我的问题的简短版本是这样的:Java 程序员如何解决 C++ 程序员使用 void 指针解决的问题?

谢谢,-莫拉格

4

3 回答 3

3

你的意思是,像这样的东西?

public void doStuff(MyType<?> someObject) { }  

?代表任何类型并代表unbounded wildcard.

请注意,此通配符有一定的限制。例如,您不能向List<?>.

有关更多信息,请参阅官方教程AngelikaLanger 泛型常见问题解答

于 2012-07-04T18:20:59.757 回答
0

我目前正在使用 Weka 编写一个构建模型的程序(使用 Weka 中包含的各种模型类型之一)。我遇到问题的部分是我想允许程序对同一功能使用多种类型。例如,如果我选择使用 J48 决策树,我需要在 J48 类型的变量上构建和调用函数。另一方面,如果我想使用 BayesNet,我需要在 BayesNet 类型的变量上构建和调用相同的函数。这个模型需要在程序的不同点使用,所以一个简单的 if-else 链是行不通的

实际上,您真正需要的是多态行为。请查看我回答的这篇文章,对此进行了一些解释:多态性

在了解了多态背后的思想之后,再深入一些,寻找工厂模式。以下是 Java 模式的好资源:

源制作模式

维基百科——工厂模式

于 2012-07-04T19:10:59.900 回答
0

您可以将超类Classifier用作任何分类器对象的类型声明,即使每个对象都是Classifier诸如J48. 它之所以有效,是因为它们都实现了超类的功能,因此即使您不一定知道您正在使用哪种特定类型的分类器,也会定义函数调用。Axcdnt 的答案链接到有关多态性的更多详细信息。无论如何,我有一个带有以下代码片段的工作程序;他们完全按照您的需要做。

Classifier Clfs = null;

    try {
        if (modelType.equals("J48")) {
            Clfs = new J48();
        } else if (modelType.equals("MLP")) {
            Clfs = new MultilayerPerceptron(); 
        } else if (modelType.equals("IB3")) {
            Clfs = new IBk(3);
        } else if (modelType.equals("RF")) {
            Clfs = new RandomForest(); 
        } else if (modelType.equals("NB")) {
            Clfs = new NaiveBayes();
//...

在其他地方,在将分类器写入我调用的文件之后

Classifier cls = (Classifier) weka.core.SerializationHelper.read(target);
prediction = cls.distributionForInstance(data.instance(0));

target是一个包含从中加载模型的文件路径的字符串)如您所见,我使用的分类器类型无关紧要,除非在创建时,当我必须指定时。注意仍然会有一些限制,例如 j48 不能预测数字类。

于 2012-07-06T04:06:32.453 回答