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

时间:2013-04-12 09:14:40

标签: java generics graph abstract-class factory-pattern

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

这是一个快速绘制的UML图enter image description here

顶点类

    public abstract class Vertex <T>{

int vertexId ;
T vertexValue ;

public  abstract <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 Map定义Type时会自动推断Type 然后将tagVertex作为String

我错误地使用了泛型吗?

5 个答案:

答案 0 :(得分:2)

您似乎在尝试写:

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>
public abstract <T> T setVertexValue();

是一个完全独立的通用参数,可以隐藏T中的Vertex<T>

答案 1 :(得分:2)

删除<T>的{​​{1}}:

Vertex.setVertexValue

答案 2 :(得分:2)

您已在setVertexValue上重新定义了类型T.使用它。

public abstract class Vertex <T>{

int vertexId ;
T vertexValue ;

public  abstract T setVertexValue();

}

它正确使用通用

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

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

}

答案 3 :(得分:1)

您的setVertexValue()本身有一个类型参数<T>;这意味着它重新定义了类的类型参数<T>。您的方法声明应该类似于

public  abstract T setVertexValue();

(注意缺少<T>

答案 4 :(得分:1)

这样的事情必须适合你。

public abstract T setVertexValue();

删除<T>