如何从通用数据类型的成员中检索值

时间:2016-03-16 11:26:10

标签: java

我有一个getter方法getSelected()如下

public abstract class AbstractController<T> implements Serializable {
     @Inject
    private AbstractFacade<T> ejbFacade;
    private Class<T> itemClass;
    private T selected;

    public T getSelected() {
        System.out.println("selected:"+selected);
        return selected;
    }
}

System.out.println("selected:"+selected);语句中,它会打印以下变量1

selected:entities.Farm[ farmPK=entities.FarmPK[ farmid=20, deviceid=102 ] ]

或变体2

selected:entities.Layoutmonitor[ layoutmonitorPK=entities.LayoutmonitorPK[ layoutid=18, monitorpointid=59, deviceid=102 ] ].

根据用户界面上的用户选择,将显示所选值。如果选择了场输入,则显示变量1,如果选择了布局监视器条目,则显示变量2。

任何人都可以帮助我检索layoutid的值并从&#39;选择&#39;中键入layoutmonitor。用户选择layoutmonitor时的字段。同样适用于运行期间的服务器场。

2 个答案:

答案 0 :(得分:0)

你问的具体事情没有具体细节。你要问的一般问题有一个普遍的答案,即how does one abstract class work with another abstract class through generics,这有点复杂,你应该有一个更简单的例子。

在您的情况下,AbstractController是“抽象控制器”类。它的具体实现可能是“FileController extends AbstractController”。

您的第二堂课是T。在您的问题中,您说T类型的任何内容都至少包含两个属性,layoutIdlayoutMonitor。因此,任何可以表示T的东西都必须具有这两个属性,并且由于它是通用的,因此暗示存在多个类。这通常是通过抽象类完成的,我们称之为SelectorBaseSelectorBase可能如下所示:

public abstract class SelectorBase {
    int layoutId;
    Object loytoutMonitor;
}

具体版本可能是TextSelector,定义为TextSelector extends SelectorBase。不需要在这里展示课程。为了让AbstractController课程适用于SelectorBase的任何扩展,您可以在泛型中声明:{/ p>

public abstract class AbstractController<T extends SelectorBase> {
    public T getSelected() {
        return selected;
    }
}

T extends SelectorBase是您问题的答案。 T被定义为扩展SelectorBase的类。这就是你如何“检索layoutid的值并从'selected'字段中键入layoutmonitor”。您可以像这样使用此类genericized interface

FileControlller c = new FileController<TextSelector>();
TextSelector s = c.getSelected();
int layoutId = s.layoutId;
Object layoutMonitor = s.layoutMonitor();
.. and so on

我不知道FarmlayoutObject还是#include <RInside.h> // for the embedded R via RInside #include <iomanip> int main(int argc, char *argv[]) { RInside R(argc, argv); // create an embedded R instance std::string txt = // load library, run regression, create summary "suppressMessages(require(stats));" "swisssum <- summary(lm(Fertility ~ . , data = swiss));" "print(swisssum)"; R.parseEvalQ(txt); // eval command, no return // evaluate R expressions, and assign directly into Rcpp types Rcpp::NumericMatrix M( (SEXP) R.parseEval("swcoef <- coef(swisssum)")); Rcpp::StringVector cnames( (SEXP) R.parseEval("colnames(swcoef)")); Rcpp::StringVector rnames( (SEXP) R.parseEval("rownames(swcoef)")); std::cout << "\n\nAnd now from C++\n\n\t\t\t"; for (int i=0; i<cnames.size(); i++) { std::cout << std::setw(11) << cnames[i] << "\t"; } std::cout << std::endl; for (int i=0; i<rnames.size(); i++) { std::cout << std::setw(16) << rnames[i] << "\t"; for (int j=0; j<cnames.size(); j++) { std::cout << std::setw(11) << M(i,j) << "\t"; } std::cout << std::endl; } std::cout << std::endl; exit(0); } 因为我不知道你在说什么代码。但总的来说,这就是你处理你所描述的情况的方法。

答案 1 :(得分:0)

尝试使用instanceof运算符:

public T getSelected() {
 if(selected instanceof Layoutmonitor){
 //print layoutid and type layoutmonitor 
 }
     return selected;
    }