2016-09-26 95 views
0

我正在转换一堆JavaC#通过Sharpen和大多数转换是罚款,只需要很小的调整,但通用转换是相当薄弱,需要很多的清理。Java到C#/静态方法与非类型通用类参数

但是在几个领域,我很困惑在Java中注入/编译downcasts(upcasts?),因为类型参数不能在静态方法的声明中使用。

给出一个Java Graph通用类和它的一个子类,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]; 
       ~~~ 
     } 
} 

当st atic方法的参数使用泛型类,即Graph g,是在运行时传递给Java虚拟机处理的静态方法的类型?

是在编译时调用Alorgithms.topo的每种方法的泛型类型实现,并将其折叠为一个大类?

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

+0

Java的泛型大部分是语法糖,所以会让事情有点不同。我很确定生成的代码对这些类型一无所知,所以它可以在没有定义任何类型的情况下进行。 –

回答

1

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

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

关于你的最后一个问题,非专利药只用在编译时使用,以防止在运行时潜在的转换异常。这是Type Erasure mechanism

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