1

This Is my Interfce BinaryHeterogenousHyperedge:

public interface BinaryHeterogenousHyperedge
    <M extends Vertex<L>, L,T extends Vertex<E>, E>
extends Hyperedge
{
    public <T> List<Vertex> search(T centroid  ,List<M> allElemntsVertex);
}

The method search take two parameter :

  • a centroid vertex of type T ( for example Tag Vertex)
  • a list of Vertx of type M != T (for example Image Vertex)

and return a list of vertex of both type T and M

TagsImagesHyperEdges implements this interface:

public class TagImagesHyperedge
    implements BinaryHeterogenousHyperedge
                   <ImageVertex,Map<String, Instance> ,TagVertex,String>
{

@Override
public <T> List<Vertex> search(T centroid, List<ImageVertex> allElemntsVertex)
    {
        // TODO Auto-generated method stub
        return null;
    }
}

Why is type T not inferred?

4

1 回答 1

5

您正在使用方法定义中的 T 来隐藏接口定义中的 T 。永远不要这样做。它们是不同的、不相关的类型参数,无法从另一个推断出一个。您的方法签名基本上是一种非常令人困惑的说法:

public List<Vertex> search(Object centroid, List<M> allElementsVertex);

Java 的一条经验法则:如果方法级别的类型参数只在方法签名中使用一次,那么使用它就毫无意义。方法级类型参数对于表达参数类型或返回类型之间的约束很有用。

于 2013-04-21T16:10:19.687 回答