Java 泛型类:引用特定于类型的方法

Java 泛型类:引用特定于类型的方法,java,generics,methods,reference,abstract,Java,Generics,Methods,Reference,Abstract,我有一个有界泛型类,我们称之为泛型类,带有一个扩展抽象类抽象的参数T: 通用类: public class Generic<T extends Abstract> { public <T extends Abstract> List<T> method() { Map<String,String> map = T.getMap(); //this is the line with the error. I'll

我有一个有界泛型类,我们称之为泛型类,带有一个扩展抽象类抽象的参数T:

通用类:

public class Generic<T extends Abstract> { 
   
   public <T extends Abstract> List<T> method() {
   
      Map<String,String> map = T.getMap(); //this is the line with the error. I'll explain it below

      //return statement and such
   }
}
公共类泛型{
公共列表方法(){
Map Map=T.getMap();//这是错误所在的行。我将在下面解释
//返回语句等
}
}
抽象类


public abstract class Abstract {
   protected Map<String, String> map;

   public abstract Map<String, String> getMap();
}
public class class1 extends Abstract {
   
   public class1() {
   //map is inmutably defined here and assigned to the super
   }

   @Override
   public Map<String, String> getMap() {
   return super.map;
   }
}

公共抽象类抽象{
保护地图;
公共抽象映射getMap();
}
泛型类中T引用的类


public abstract class Abstract {
   protected Map<String, String> map;

   public abstract Map<String, String> getMap();
}
public class class1 extends Abstract {
   
   public class1() {
   //map is inmutably defined here and assigned to the super
   }

   @Override
   public Map<String, String> getMap() {
   return super.map;
   }
}
公共类class1扩展了抽象类{
公共类别1(){
//映射在这里以不可变的方式定义并分配给超级用户
}
@凌驾
公共地图getMap(){
返回super.map;
}
}
当尝试引用方法getMap()时,它来自T边界内的一个类(根据抽象类定义,T的所有可能实例都将具有该类),我得到以下错误:

无法从静态上下文引用非静态方法getMap()

但是没有任何静态关键字。我遗漏了什么


谢谢!

因为方法
getMap()
是一个实例方法(即不是
static
),如果
T
调用该方法,则需要一个实例


您的类层次结构看起来也不太好。我认为您实际上想要的是:

public class Generic<T> extends Abstract<T> { 

}

public abstract class Abstract<T> {
    protected Map<String, T> map;
}
公共类泛型扩展抽象{
}
公共抽象类抽象{
保护地图;
}

但是如果没有您的意图,我不能确定。

是的,为了清晰起见,我简化了整个过程。在我的项目中,有一个名为“Material”的抽象类,以及一组在这些字段中具有类似字段和操作的材质,它们都扩展了Material类。我正在尝试编写一些DB操作(通用类)对于具有单个类的所有材质都是通用的。这里的映射是所有材质的哈希映射。您对改进我的结构有什么建议吗?还有,有没有方法在泛型类中声明T的实例?我尝试了T=new T();但它当然不起作用。谢谢!最好发布实际代码的简化版本-这对读者来说更有意义。如果您有编译错误,请在此处询问。如果您要求评论或您的方法,请询问“谢谢”,就可以了!