Tag: generics

如何在Java中为generics类创buildgenerics构造函数?

我想创build一个KeyValue类,但以通用的方式,这就是我写的: public class KeyValue<T,E> { private T key; private E value; /** * @return the key */ public T getKey() { return key; } /** * @param key the key to set */ public void setKey(T key) { this.key = key; } /** * @return the value */ public E getValue() { return value; } […]

将Hibernate Query.list()转换为List <Type>的“正确”方法是什么?

我是Hibernate的新手,我正在写一个简单的方法来返回匹配特定filter的对象列表。 List<Foo>似乎是一个自然的返回types。 无论我做什么,除非我使用丑陋的@SuppressWarnings ,否则我似乎无法使编译器高兴。 import java.util.List; import org.hibernate.Query; import org.hibernate.Session; public class Foo { public Session acquireSession() { // All DB opening, connection etc. removed, // since the problem is in compilation, not at runtime. return null; } @SuppressWarnings("unchecked") /* <—– */ public List<Foo> activeObjects() { Session s = acquireSession(); Query q = s.createQuery("from foo […]

ArrayList.toArray()中的Javagenerics

假设你有一个数组列表定义如下: ArrayList<String> someData = new ArrayList<>(); 后来在你的代码中,由于generics,你可以这样说: String someLine = someData.get(0); 编译器知道它会得到一个string。 耶generics! 但是,这将失败: String[] arrayOfData = someData.toArray(); toArray()将始终返回一个对象数组,而不是定义的generics。 为什么get(x)方法知道它正在返回什么,但toArray()默认为Objects?

不能将types'Int'隐式转换为'T'

我可以调用Get<int>(Stat); 或Get<string>(Name); 但编译时我得到: 不能将types'int'隐式转换为'T' string一样的东西。 public T Get<T>(Stats type) where T : IConvertible { if (typeof(T) == typeof(int)) { int t = Convert.ToInt16(PlayerStats[type]); return t; } if (typeof(T) == typeof(string)) { string t = PlayerStats[type].ToString(); return t; } }

genericsJava方法的generics是否可以用来强制参数的types?

我想使用genericstypes来确保方法的参数是相同types的,如下所示: public static <T> void x(T a, T b) 我会假定传递给这个方法的两个参数(a和b)总是必须是相同的types。 但令我惊讶的是,我能够将任何types的参数(甚至是基元)传递给方法x,就好像T被擦除为Object,不pipe传递了什么参数。 我发现迄今为止唯一的解决方法是使用像这样的“扩展”: public static <T, U extends T> void x(T a, U b) 但是虽然我能忍受,但这不是我想要的。 有没有办法使用genericstypes来强制方法的所有参数的types?

Java:有界通配符或有界的types参数?

最近,我阅读了这篇文章: http : //download.oracle.com/javase/tutorial/extra/generics/wildcards.html 我的问题是,而不是像这样创build一个方法: public void drawAll(List<? extends Shape> shapes){ for (Shape s: shapes) { s.draw(this); } } 我可以创build一个这样的方法,它工作正常: public <T extends Shape> void drawAll(List<T> shapes){ for (Shape s: shapes) { s.draw(this); } } 我应该使用哪种方式? 在这种情况下通配符是否有用?

generics方法存储在哪里?

我已经阅读了一些有关generics的信息,并注意到一件有趣的事情。 例如,如果我有一个generics类: class Foo<T> { public static int Counter; } Console.WriteLine(++Foo<int>.Counter); //1 Console.WriteLine(++Foo<string>.Counter); //1 在运行时,两个类Foo<int>和Foo<string>是不同的。 但是具有generics方法的非generics类的情况呢? class Foo { public void Bar<T>() { } } 很显然,只有一个Foo类。 但是方法Bar呢? 所有通用的类和方法都在运行时用它们使用的参数closures。 这是否意味着Foo类有很多Bar实现,并且这个方法的信息存储在内存中?

优雅的方式来结合多个元素的集合?

说我有任意数量的集合,每个集合包含相同types的对象(例如, List<int> foo和List<int> bar )。 如果这些集合本身位于一个集合中(例如List<List<int>> ,则可以使用SelectMany将它们合并到一个集合中。 但是,如果这些集合不在同一个集合中,那么我的印象就是我必须编写如下的方法: public static IEnumerable<T> Combine<T>(params ICollection<T>[] toCombine) { return toCombine.SelectMany(x => x); } 然后我会这样叫: var combined = Combine(foo, bar); 有没有一个干净,优雅的方式来结合(任意数量)的集合,而无需编写像上面的Combine这样的实用程序方法? 看起来很简单,在LINQ中应该有办法做到,但也许不行。

如何检查给定的值是否为通用列表?

public bool IsList(object value) { Type type = value.GetType(); // Check if type is a generic list of any type } 检查给定对象是列表还是可以转换为列表的最好方法是什么?

在C#4.0中命名参数和genericstypes推断

我一直在编程的假设是,当在C#4.0中调用方法时,为参数提供名称不会影响结果,除非这样做是“跳过”一个或多个可选参数。 所以我有点惊讶地发现以下行为: 给定一个采用Func<T> ,执行它并返回结果: public static T F<T>(Func<T> f) { return f(); } 另一种可以看到上述方法的方法: static void Main() { string s; 调用F(没有命名参数)编译没有任何问题: s = F<string>(() => "hello world"); // with explicit type argument <string> s = F(() => "hello world"); // with type inference 而当使用命名参数… s = F<string>(f: () => "hello world"); …使用显式types参数的上述代码行仍然编译没有问题。 也许不会太奇怪,如果你安装了ReSharper,它会提示“Type参数规范是多余的”。 但是,当删除types参数… s […]