这是我的问题
public class Row{
//It is just a class
}
public class RowUsedByThisClass{
public Row someOp(Row r){
/*I am Using this method with r a instance of Row.
*r may be sub type of the Row. I have to inspect r and have to
*return a new instance. But the new instance just cant be type
*Row it should be exact subtype r belongs.In shor i have to
*determin the type of return object runtime.
*Is it possible in java? Can i use generics.
*/
}
}
答案 0 :(得分:2)
如果Row
的每个子类都有一个无参数构造函数,那么在someOp
内可以使用r.getClass().newInstance()
。
答案 1 :(得分:1)
这需要反思,而不是泛型:
Row newRow = r.getClass().newInstance();
但是,这要求类具有默认(无参数)构造函数。
答案 2 :(得分:1)
我认为你应该为someOp()
的每个子类实现Row
。
然后你基本上使用方法分派作为检测类的机制,并且可以为每个类适当地处理op。
答案 3 :(得分:0)
您可以使用getClass()函数来确定对象的类型。
答案 4 :(得分:0)
实际上,您有两种方法可以确定对象类型。
首先使用关键字instanceof:
if (row instanceof MyRow) {
// do something
}
其次是使用getClass():
Class clazz = row.getClass();
if (clazz.equals(MyRow.class)) {}
if (MyRow.calss.isAssignableFrom(clazz)) {}
然后你可以决定你想要什么。例如,您甚至可以创建扩展Row并返回它的其他类的新实例,或者使用参数包装传递的行。
答案 5 :(得分:0)
您可以而且应该在类型签名中指定:
public class RowUsedByThisClass <T extends Row> {
public T someOp (T t) {
答案 6 :(得分:0)
您可以使用reflection API和一些仿制药来实现您的目标。
import java.lang.reflect.Constructor;
class Row {
//It is just a class
}
class RowUsedByThisClass {
public <R extends Row> R someOp(final R r) {
R newR = null;
try {
// Use no-args constructor
newR = (R) r.getClass().newInstance();
// Or you can use some specific constructor, e.g. in this case that accepts an Integer, String argument
Constructor c = r.getClass().getConstructor(Integer.class, String.class);
newR = (R) c.newInstance(1, "2");
// do whatever else you want
} catch (final Exception ex) {
// TODO Handle this: Error in initializing/cconstructor not visible/...
}
return newR;
}
}