我正在尝试使用一个类型参数创建一个泛型类class MyClass<E>
,它具有一个具有两个类型参数的第二个泛型类的类变量,SecondClass<V, E>
。因为对于我的代码来说,类型是什么并不重要V
,所以我将该变量的类型声明为SecondClass<?, E> var
. 在 MyClass 的实现中,我在 var 上调用一个返回 V, 的方法public V foo(E e)
,然后将此 V 类型的对象传递给 var, 的另一个方法public int bar(V v)
。但是,由于我只是模糊理解的原因,这并没有编译,但我相信它已在此处进行了解释。
显然,捕获-?foo 返回的与捕获的不同?酒吧要求。但为什么?无论 V 的实际类型是什么,这两种方法都必须相同,因为它们是在同一个实例上调用的。我在这里想念什么?
最终,我想知道的是:为了使代码编译,我需要更改什么,而不在 MyClass 的类型参数中添加 V?(我不想强制 MyClass 的用户指定 V 的类型,因为这无关紧要)
为了给你一个更具体的例子,这是我正在做的一个简化版本。正如您可能已经通过类型参数猜到的那样,它涉及图形。MyClass
转换为EdgePainter
并SecondClass
转换为Graph
。使用此代码,编译错误位于EdgePainter.getColor(E)
.
class Graph<V, E>
{
public V getTarget(E edge)
{
return null;
}
public int getInDegree(V vertex)
{
return 0;
}
}
class EdgePainter<E>
{
private static final Color COLOR_FOR_MANY_EDGES = Color.RED;
private static final Color COLOR_FOR_FEW_EDGES = Color.BLUE;
private Graph<?, E> graph;
public EdgePainter(Graph<?, E> aGraph)
{
graph = aGraph;
}
public Color getColor(E edge)
{
// My compiler says:
// The method getInDegree(capture#3-of ?) in the type
// Graph<capture#3-of ?,E> is not applicable for the arguments
// (capture#4-of ?)
int degree = graph.getInDegree(graph.getTarget(edge));
if (degree > 10)
return COLOR_FOR_MANY_EDGES;
else
return COLOR_FOR_FEW_EDGES;
}
}