我有一个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时的字段。同样适用于运行期间的服务器场。
答案 0 :(得分:0)
你问的具体事情没有具体细节。你要问的一般问题有一个普遍的答案,即how does one abstract class work with another abstract class through generics
,这有点复杂,你应该有一个更简单的例子。
在您的情况下,AbstractController
是“抽象控制器”类。它的具体实现可能是“FileController extends AbstractController”。
您的第二堂课是T
。在您的问题中,您说T
类型的任何内容都至少包含两个属性,layoutId
和layoutMonitor
。因此,任何可以表示T的东西都必须具有这两个属性,并且由于它是通用的,因此暗示存在多个类。这通常是通过抽象类完成的,我们称之为SelectorBase
。 SelectorBase
可能如下所示:
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
我不知道Farm
是layoutObject
还是#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;
}