Tag: generics

在部分特定的类上标记调度和静态方法

假设我想写一个generics函数void f<T>() ,如果T是一个PODtypes,那么做一件事,如果T是非POD(或任何其他任意谓词),则做另一件事。 实现这一点的一种方法是使用像标准库一样的标签分派模式来处理迭代器类别: template <bool> struct podness {}; typedef podness<true> pod_tag; typedef podness<false> non_pod_tag; template <typename T> void f2(T, pod_tag) { /* POD */ } template <typename T> void f2(T, non_pod_tag) { /* non-POD */ } template <typename T> void f(T x) { // Dispatch to f2 based on tag. f2(x, podness<std::is_pod<T>::value>()); } 另一种方法是使用部分专用types的静态成员函数: […]

Java 8 Lambdas上的reflectiontypes推断

我正在尝试Java 8中的新Lambdas,并且正在寻找一种在lambda类上使用reflection来获取lambda函数的返回types的方法。 我特别感兴趣的是lambda实现通用超接口的情况。 在下面的代码示例中, MapFunction<F, T>是通用超接口,我正在寻找一种方法来查找绑定到通用参数T 。 虽然Java在编译器之后丢弃了大量的genericstypes信息,但generics超类和generics超接口的子类(和匿名子类)却保留了这种types的信息。 通过reflection,这些types是可访问的。 在下面的例子(例1)中 ,reflection告诉我, MyMapper实现将java.lang.Integer绑定到genericstypes参数T 即使对于本身是generics的子类,也有一些方法可以找出与generics参数绑定的是什么,如果其他的已知的话。 在下面的例子中考虑情况2 ,其中F和T绑定到相同types的IdentityMapper 。 当我们知道的时候,如果我们知道参数typesT (在我的情况下,我们知道的话),我们知道typesF 现在的问题是,我怎样才能实现Java 8 lambdas类似的东西呢? 由于它们实际上不是generics超级界面的常规子类,因此上述方法不起作用。 具体来说,我可以找出parseLambda将java.lang.Integer绑定到T , identityLambda parseLambda绑定到F和T ? PS:理论上讲,应该可以反编译lambda代码,然后使用embedded式编译器(如JDT)并进入其types推断。 我希望有一个更简单的方法来做到这一点;-) /** * The superinterface. */ public interface MapFunction<F, T> { T map(F value); } /** * Case 1: A non-generic subclass. */ public class MyMapper implements […]

JavagenericsWildCard:<? 扩展Number> vs <T extends Number>

这两个函数有什么区别? static void gPrint(List<? extends Number> l) { for (Number n : l) { System.out.println(n); } } static <T extends Number> void gPrintA(List<T> l) { for (Number n : l) { System.out.println(n); } } 我看到相同的输出。

引用XML代码中的genericstypes注释

据我所知,在C#types/方法的XML注释中,可以在标签中引用genericstypes,如下所示: ///<see cref="name.space.typename&lt;T&rt;(paramtype)"> 但是我认为,还有另一种语法,这不是笨拙的? 有些东西,摆脱这些HTML实体“<”? 我现在找不到它。 有人可以帮忙吗?

如何获得genericstypes参数的types名称?

如果我有一个方法签名像 public string myMethod<T>( … ) 我怎么能在方法里面得到作为types参数给出的types的名字? 我想要做类似于typeof(T).FullName ,但实际上工作…

无法对参数化typesArrayList <Foo>执行​​instanceof检查

以下代码: ((tempVar instanceof ArrayList<Foo>) ? tempVar : null); 原因: 无法对参数化typesArrayList<Foo>执行instanceof检查。 请使用表单ArrayList<?>因为更多的genericstypes信息将在运行时被删除 有人可以解释我什么是“进一步genericstypes信息将被删除在运行时”以及如何解决这个问题?

具有通用参数types的函数

我想弄清楚如何定义一个函数,适用于多种types的参数(如int和int64)。 据我了解,函数重载是不可能在F#(编译器肯定抱怨)。 以下面的function为例。 let sqrt_int = function | n:int -> int (sqrt (float n)) | n:int64 -> int64 (sqrt (float n)) 编译器当然抱怨语法是无效的(模式匹配中的types约束似乎不被支持),但我认为这说明了我想实现的function:一个函数在多个参数types上运行,并返回一个值types。 我有一种感觉,这是可能的在F#使用genericstypes/types推理/模式匹配的一些组合,但语法躲过了我。 我也尝试使用:? 运算符(dynamictypestesting)和模式匹配块中的子句时 ,这仍会产生各种错误。 由于我对这门语言比较陌生,所以我很可能会在这里做一些不可能的事情,所以请让我知道是否有其他解决办法。

Javagenerics强制执行兼容通配符

我有这些课程。 class RedSocket {} class GreenSocket {} class RedWire {} class GreenWire {} 我有一个类使用2个genericstypes public class Connection<W, S> {} 其中W是导线types,S是socketstypes。 我试图强制编译时检查,以确保套接字和电线具有相同的颜色。 我试过这样做: public class Connection<W extends Wire & Color, S extends Socket & Color> {} interface Color {} interface Red extends Color {} interface Green extends Color {} interface Socket {} interface Wire {} class […]

为什么List <T>不是线程安全的?

从以下网站: http://crfdesign.net/programming/top-10-differences-between-java-and-c 不幸的是, List<>不是线程安全的(C#的ArrayList和Java的Vector是线程安全的)。 C#也有一个Hashtable ; 通用版本是: 是什么让List<T>不是线程安全的? .NET框架工程师的实现问题? 或者generics不是线程安全的?

将通用列表转换为数组

我已经search了这个,但不幸的是,我没有得到正确的答案。 class Helper { public static <T> T[] toArray(List<T> list) { T[] array = (T[]) new Object[list.size()]; for (int i = 0; i < list.size(); i++) { array[i] = list.get(i); } return array; } } testing它: public static void main(String[] args) { List<String> list = new ArrayList<String>(); list.add("abc"); String[] array = toArray(list); System.out.println(array); } 但是有一个错误: […]