具有非类型泛型类参数的Java到C#/静态方法

时间:2016-09-26 03:48:56

标签: java c# generics

我正在通过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使用不同GraphVisitors泛型(以及这两个基类的子类)的数组进行调用:

public final class Algorithms
{
        public static void topoSort(Graph g, Visitor visitor)
        {
                Vertex[] vertices = new Vertex[noOfDegreesOfFreedom];
                ~~~
        }
}

当静态方法的参数使用泛型类,即Graph g时,传递给Java VM在运行时处理的静态方法的类型是什么?

是在编译时调用Alorgithms.topo并折叠成单个大类的每个方法推断的泛型类型实现?

在一天结束的时候,我试图找出将这些转换为C#的最不痛苦的方法。

1 个答案:

答案 0 :(得分:2)

首先,Java中的静态方法也支持泛型。以下方法可以在任何类中声明:

public static <E> E[] appendToArray(E[] array, E item)

关于您的上一个问题,泛型仅在编译时用于防止运行时潜在的强制转换异常。这是Type Erasure mechanism

如果您没有为通用类型指定任何类型(例如Graph),Java将只假设它是Graph<Object>