Java 抽象方法的返回值是否可以是泛型类型

Java 抽象方法的返回值是否可以是泛型类型,java,generics,graph,abstract-class,factory-pattern,Java,Generics,Graph,Abstract Class,Factory Pattern,我的项目的第一部分是构造一个超图 这是一个快速绘制的UML图 顶点类 public abstract class Vertex <T>{ int vertexId ; T vertexValue ; public abstract <T> T setVertexValue(); } 公共抽象类顶点{ 内顶点; T顶点值; 公共摘要T setVertexValue(); } imageVertex类 public class ImageVe

我的项目的第一部分是构造一个超图

这是一个快速绘制的UML图

顶点类

    public abstract class Vertex <T>{

int vertexId ;
T vertexValue ;

public  abstract <T> T setVertexValue();

    }
公共抽象类顶点{
内顶点;
T顶点值;
公共摘要T setVertexValue();
}
imageVertex类

   public class ImageVertex extends Vertex<Map<String, Instance>>{

@Override
public <T> T setVertexValue() {
    // TODO Auto-generated method stub
    return null;
}}
公共类ImageVertex扩展了Vertex{
@凌驾
公共T setVertexValue(){
//TODO自动生成的方法存根
返回null;
}}
我以为在为imageVertex贴图定义该类型时,会自动推断该类型 稍后将tagVertex用作字符串


我是否错误地使用了泛型?

你似乎在试图写:

public abstract class Vertex<T> {

    int vertexId;
    T vertexValue;

    public abstract T setVertexValue(); // NOTE: no <T>
}

public class ImageVertex extends Vertex<Map<String, Instance>> {

    @Override
    public Map<String, Instance> setVertexValue() {
        return null;
    }
}
公共抽象类顶点{
内顶点;
T顶点值;
公共摘要T setVertexValue();//注意:否
}
公共类ImageVertex扩展了Vertex{
@凌驾
公共映射setVertexValue(){
返回null;
}
}
在您的代码中,中的

public abstract <T> T setVertexValue();
public abstract T setVertexValue();
是一个完全独立的通用参数,在
顶点中阴影
T

删除
顶点的
。setVertexValue

public abstract T setVertexValue();

您已经在
setVertexValue
上重新定义了类型T。用这个

public abstract class Vertex <T>{

int vertexId ;
T vertexValue ;

public  abstract T setVertexValue();

}
公共抽象类顶点{
内顶点;
T顶点值;
公共摘要T setVertexValue();
}
它正确地使用了泛型

public class ImageVertex extends Vertex<Map<String, String>>
{

    @Override
    public Map<String, String> setVertexValue()
    {
        // TODO Auto-generated method stub
        return null;
    }

}
公共类ImageVertex扩展了Vertex
{
@凌驾
公共映射setVertexValue()
{
//TODO自动生成的方法存根
返回null;
}
}
您的
setVertexValue()
本身有一个类型参数
;这意味着它将重新定义类的类型参数
。您的方法声明应该如下所示

public  abstract T setVertexValue();

(注意没有

这样的东西一定适合你

public abstract T setVertexValue();
删除