java - java 中使用泛型替代抽象静态/静态重写方法

标签 java generics static overriding abstract

好吧,我知道你不能有一个抽象的静态方法,尽管我个人认为这是一个限制。我也知道重写静态方法是没有用的,因为当我处理说 MyList<T extends ObjectWithId> 时我的对象有一个带有静态方法的抽象类,该方法在其子类中被重写,T 在运行时不存在,所以 ObjectWithId将调用 的静态方法而不是子类。

这就是我所拥有的:

class PersistentList<T extends ObjectWithId> implements List<T>{

}

哪里ObjectWithId是:

abstract ObjectWithId{
    public abstract long getId();
}

现在的问题是我的 PercientList 应该存储在硬盘上,因此得名,并且实际上只会存储它所保存的对象的 id。现在当我想实现

@Override
public T get(int index) {

}

PersistentList的方法,我想要的是我的程序使用 id它已存储 index并调用静态方法 objectForId(long id)这将在 ObjectWithId 的每个子类中实现。它不能是实例方法,因为还没有实例,重点是使用id从硬盘加载实例。 。那么应该如何实现呢?一种选择是 ObjectWithId有一个构造函数 ObjectWithId(long id)在每个子类中实现,但 T 在运行时不存在,那么我如何实例化它?我知道我可以通过Class<T> PersistentList 的构造函数中的对象但我更希望构造函数没有任何参数,但我认为没有办法在不显式传递 T 的类的情况下获取它,对吗?

我希望这是一个更好的解释,对于我一开始提出的含糊不清的问题感到抱歉。

最佳答案

通过Class<T>时作为构造函数参数,它并不能真正解决您的问题。然后,您可以访问该类,但要访问该类上定义的静态方法,您必须使用泛型(除非其他人知道从 Class 对象调用类上定义的静态方法的方法)。

我将定义一个新的通用接口(interface),其中包含通用方法 objectForID ,类似

public interface ObjectRetriever<T>{
  public T objectForID( long aID );
}

并调整 PersistentList 的构造函数采取这样的ObjectRetriever实例作为参数。这个ObjectRetriever然后可以根据对象的 ID 来恢复对象。

关于java - java 中使用泛型替代抽象静态/静态重写方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8450757/

相关文章:

java - 如何在 Java 中公开方法调用的动态列表?

c# - 如何从接口(interface)返回派生程度更高的类型?

c# - 多用户 ASP.NET Web 应用程序中静态变量的范围

java - 动态更新 fragment

java - Hibernate C3P0 - NoClassDefFoundError

java - 从抽象类返回 Java 上的通用对象

java - 为什么从无界通配符 <?> 到 <? extends Object> 不会生成未经检查的转换警告?

java - 如何正确访问静态成员类?

PHP 网站转换为静态 HTML 网站 - 链接问题

Java将 map 值放入树集中?