我正在通过Java
将一堆C#
转换为Sharpen
,并且大部分转换都很好,只需要进行一些小调整,但通用转换相当弱,需要大量的清理。
但是在几个方面,我很困惑如何用Java注入/编译downcast(upcasts?),因为类型参数不能用于静态方法的声明。
鉴于Java Graph
Generic类及其中一个子类DependencyGraph<T>
:
public class Graph<V, E>
{
~~~
}
public final class DependencyGraph<T> extends Graph<String, Object>
{
~~~
}
以下Java静态Alorgithms.topo
使用不同Graph
和Visitors
泛型(以及这两个基类的子类)的数组进行调用:
public final class Algorithms
{
public static void topoSort(Graph g, Visitor visitor)
{
Vertex[] vertices = new Vertex[noOfDegreesOfFreedom];
~~~
}
}
当静态方法的参数使用泛型类,即Graph g
时,传递给Java VM在运行时处理的静态方法的类型是什么?
或是在编译时调用Alorgithms.topo
并折叠成单个大类的每个方法推断的泛型类型实现?
在一天结束的时候,我试图找出将这些转换为C#的最不痛苦的方法。
答案 0 :(得分:2)
首先,Java中的静态方法也支持泛型。以下方法可以在任何类中声明:
public static <E> E[] appendToArray(E[] array, E item)
关于您的上一个问题,泛型仅在编译时用于防止运行时潜在的强制转换异常。这是Type Erasure mechanism。
如果您没有为通用类型指定任何类型(例如Graph
),Java将只假设它是Graph<Object>
。