克服重复方法静态参考超级

时间:2015-01-12 07:52:20

标签: java inheritance

我们都知道,在Java中,如果在static类中声明Abstract方法,则该方法将属于Abstract类,而不属于其子类。 (没有abstract static

我有一个简单的数据库系统,它有一个Abstract Model类:

public abstract class Model<T> {

     // WON'T WORK (unfortunately I can't use abstract static)
     public static T find(int id) {
          ...
     }

}

正如您所看到的,我无法在该类上创建一个返回泛型的静态方法,因为该方法不是继承的,因此它属于抽象类。

解决方法是在抽象类上创建一个受保护的方法,然后在每个子类上创建一个静态方法:

public abstract class Model<T> {

     protected T find(int id) {
          ...
     }

}

public class User extends Model {

     public static User find(int id) {
           User dummy = new User();
           return (User) dummy.find(id);
     }
}

我觉得有更好的方法可以做到这一点。

有什么想法吗?

2 个答案:

答案 0 :(得分:1)

我可以想到两个可能的选择,虽然有一个是黑客攻击。第一个是使Model<T>成为普通类,并添加一个静态方法来获得这样的模型:

//I do not know how you want to do the user class, I just made it take the models class
private static final Model<User> MODEL = new Model<User>(User.class);
public static Model<User> model() {
    return MODEL;
}

您可以这样使用它:User.model().find(id)

另一种选择是向类中添加一个公共静态变量,并static导入该变量以调用其上的方法,就像它是类而不是Model实例一样。例如:

public class User {
    public static Model<User> User = new Model<User>(User.class);
}

使用static import my.package.User.User;导入它可以使用User user = User.find(id);,其中第一个User是类名,第二个User是静态变量。

否则,您必须将静态方法放在每个类中,因为遗憾的是您不能继承或覆盖它们。

答案 1 :(得分:1)

您可以使用具有扩展父类的类型的静态泛型方法。但是,您需要一个类型的实例才能返回类型T.最简单的方法是传入调用者,但它可能只是一个空实例。

例如,您可以执行以下操作:

//No more generic Model
public abstract class Model
{
    //Our generic static method; we need caller to get something of type T to return.
    public static <T extends Model> T find(int id, T caller)
    {
        ...
        return caller.getMyReturnObject(id);
    }
}

要调用此功能,您只需执行

Model model = find(someId, new Model{...})

如果您在new Model{...}的子级中调用thisModel可以替换为(T) type.getClass().newInstance();

如果你需要在方法中创建一个新的T实例,那么你仍然需要传入一些东西作为T(调用者仍然有效)并使用反射来创建新实例(使用像{{1}这样的东西而不是new T())。