Tag: generics

有什么区别? super E>和<? 扩展E>?

有什么区别<? super E> <? super E>和<? extends E> <? extends E> ? 例如,当你看一下类java.util.concurrent.LinkedBlockingQueue ,这个构造函数有下面的签名: public LinkedBlockingQueue(Collection<? extends E> c) 和一个为方法: public int drainTo(Collection<? super E> c)

types'T'的值不能被转换为

这可能是一个新手的问​​题,但谷歌惊讶地没有提供答案。 我有这个相当人造的方法 T HowToCast<T>(T t) { if (typeof(T) == typeof(string)) { T newT1 = "some text"; T newT2 = (string)t; } return t; } 来自一个C + +背景我期望这个工作。 但是,对于上述两个赋值,无法将“不能将typesT'隐式转换为string”和“不能将types'T'转换为string”。 我要么做一些概念上的错误,要么就是错误的语法。 请帮我整理一下。 谢谢!

通用列表 – 移动列表中的项目

所以我有一个通用的列表,一个oldIndex和一个newIndex值。 我想尽可能简单地将oldIndex的项目移动到newIndex 。 有什么build议么? 注意 该项目应该在(newIndex – 1)和newIndex之间的项目之间被删除。

正确的方法来检查types是否为空

为了检查Type ( propertyType )是否为空,我使用: bool isNullable = "Nullable`1".Equals(propertyType.Name) 有没有办法避免使用魔术string?

Javagenerics中“&”和“,”有什么区别?

在阅读关于generics的Java官方教程时,我发现你可以限制types参数(在这种情况下是T )来扩展一个类和/或更多的与'和'运算符( & )的接口,如下所示: <T extends MyClass & Serializable> 我用&replace了, (错误的,仍然有效,还有一个小小的警告)。 我的问题是,这两者之间有什么区别: <T extends MyClass & Serializable> <T extends MyClass , Serializable> // here is with comma 和示例方法: static <T extends MyClass & Serializable> ArrayList<T> fromArrayToCollection(T[] a) { ArrayList<T> arr = new ArrayList<T>(); for (T o : a) { arr.add(o); // Correct } return arr; […]

为什么Java不允许Throwable的通用子类?

根据Java语言select第3版: 如果generics类是Throwable的直接或间接子类,那么这是一个编译时错误。 我想了解为什么做出这个决定。 genericsexception有什么问题? (据我所知,generics只是编译时语法糖,在.class文件中它们会被翻译成Object ,所以有效地声明一个generics类就好像它的一切都是一个Object 。我错了。)

如果方法的返回types是Void,我该返回什么? (不是空的!)

由于在Java中使用generics,我最终不得不实现一个具有Void作为返回types的函数: public Void doSomething() { //… } 编译器要求我返回一些东西 。 现在我只是返回null ,但我想知道如果这是好的编码习惯… 我也尝试过Void.class , void , Void.TYPE , new Void() ,根本没有任何回报,但所有这些都不起作用。 (或多或less显而易见的原因)(请参阅此答案的详细信息) 那么如果函数的返回types是Void我应该返回什么呢? 什么是Void类的一般用法? 编辑:只是为了节省您的downvotes:我问V oid,而不是v oid。 类Void , 而不是保留关键字void 。

为什么Java枚举文字不能有genericstypes参数?

Java枚举是伟大的。 generics也是如此。 当然,我们都知道后者由于types擦除的局限性。 但有一件事我不明白,为什么我不能创build一个像这样的枚举: public enum MyEnum<T> { LITERAL1<String>, LITERAL2<Integer>, LITERAL3<Object>; } 这个genericstypes参数<T>反过来可以在各个地方有用。 设想一个方法的genericstypes参数: public <T> T getValue(MyEnum<T> param); 甚至在枚举类本身: public T convert(Object o); 更具体的例子#1 由于上面的例子对于某些人来说似乎太抽象了,下面是为什么我想要这样做的一个更现实的例子。 在这个例子中,我想使用 枚举,因为那么我可以列举一组有限的属性键 generics,因为那样我可以有方法级别的types安全性来存储属性 public interface MyProperties { public <T> void put(MyEnum<T> key, T value); public <T> T get(MyEnum<T> key); } 更具体的例子#2 我有一个数据types的枚举: public interface DataType<T> {} public enum SQLDataType<T> […]

如何使Java通用方法静态?

以下是关于如何使Javagenerics类将单个项目追加到数组的一个片段。 我怎样才能使appendToArray静态方法。 向方法签名添加静态会导致编译错误。 public class ArrayUtils<E> { public E[] appendToArray(E[] array, E item) { E[] result = (E[])new Object[array.length+1]; result[array.length] = item; return result; } }

foreach vs someList.ForEach(){}

显然有很多方法来迭代一个集合。 好奇的是,如果有任何分歧,或者为什么你会用另一种方式。 第一类: List<string> someList = <some way to init> foreach(string s in someList) { <process the string> } 另一种方式: List<string> someList = <some way to init> someList.ForEach(delegate(string s) { <process the string> }); 我想我的头顶上,而不是我上面使用的匿名委托,你会有一个可以指定的可重用的委托…