Tag: generics

递归generics

有没有办法使这种方法适当通用并取消警告? /** * Sort a collection by a certain “value” in its entries. This value is retrieved using * the given valueFunction which takes an entry as argument and returns * its value. * * Example: * // sort tiles by number *Collects.sortByValue(tileList, true, new Function() { * public Integer call(NormalTile t) { * return […]

Android中的javagenerics

我不明白以下代码: public class EventAdapter extends ArrayAdapter { public EventAdapter(Context context, int textViewResourceId, List objects) { super(context, textViewResourceId, objects); this.resource = textViewResourceId; } } 我对两种情况下的部分感到困惑。 我知道它与generics有关,但我不明白。 我阅读http://docs.oracle.com/javase/tutorial/java/generics/ ,但仍然不明白。 我知道objects是Event类型的对象的ArrayList 。 我不理解的部分是使用Type 扩展ArrayAdapter。 这意味着什么?

带有ArrayList通配符的Java HashMap

我有一个HashMap,其值是ArrayLists,我正在尝试编写一个函数来接受这些HashMaps的generics实例 HashMap<String, ArrayList> myMap = new HashMap<String, ArrayList>(); public static void foo(HashMap<?, ArrayList> a) {} public static void bar(HashMap<?, ? extends ArrayList> a) {} // Compilation Failure! foo(myMap); // This works, but why do I need ? extends ArrayList bar(myMap) 错误消息是 类型为Example的方法foo(HashMap<?,ArrayList>)不适用于参数( HashMap<String,ArrayList> )。 为什么我需要为extends ArrayList使用通配符? 我认为通过使用ArrayList (没有? extends ),我可以将函数限制为仅具有ArrayList值的HashMaps。 我也知道以下通用方法有效: public static void printer(HashMap<K, […]

通用树,自有界generics

我要为我的一个项目添加通用性。 我喜欢generics,因为这会使我的代码更加健壮,自我记录并删除所有那些丑陋的演员。 然而,我遇到了一个棘手的案例,并试图表达我的一个结构的“递归”约束。 这基本上是某种“通用”树,具有双链接(对于孩子和父母)。 我最大限度地简化了课程以显示问题: public class GenericTree< ParentClass extends GenericTree, ChildClass extends GenericTree> { // Attributes private ArrayList children = new ArrayList(); private ParentClass parent = null; // Methods public void setParent(ParentClass parent) { this.parent = parent; } public void addChild(ChildClass child) { child.setParent(this); this.children.add(child); } } 问题出在指令: child.setParent(this) 。 Java给出以下错误: 绑定不匹配:ChildClass类型的方法setParent(?)不适用于 参数(GenericTree)。 通配符参数? […]

使用JDK 8编译generics方法时损坏

我有一些带有类Box遗留代码,可以将Serializable数据放入Map ,当使用Oracle JDK 1.7 Update 80编译时,它可以在Oracle JRE 1.8 Update 102上正常运行。 但是当我使用Oracle JDK 1.8 Updater 102编译它时,它无法正常运行。 我遇到了genericsget函数的一些问题。 SSCCE使用有问题的通用get函数从Box实例输出格式化日期: import java.io.Serializable; import java.util.Date; import java.util.HashMap; public class Box implements Serializable{ private HashMap values = new HashMap(); public T get(String key){ return (T) this.values.get(key); } public void put(String key, Serializable value){ this.values.put(key, value); } public static void main(String[] […]

Javagenerics – Java是否需要支持本地定义的类型?

我希望能在这里找到Java仿制药专家。 假设你有一些打字类: public interface SomeClass { void doSomething(final T t); } 在给定SomeClass的实例的情况下,还有一个函数可以获取T的实例: public static class Retriever { public T get(final SomeClass c) { return null; // actual implementation left out } } 现在假设您有一个SomeClass和一个检索器的集合: final List<SomeClass> myClasses = null; // actual implementation left out final Retriever myRetriever = null; // actual implementation left out 我们无法执行以下操作: for […]

如何在Java中设计类型安全的堆栈,防止从空列表中弹出?

这是这两个问题的分支: 1,2 。 我想在Java中实现类型安全的数据结构,以防止无意义的操作。 例如,如果编译器知道我有一个空堆栈的实例,它不应该允许我在空堆栈上调用pop。 作为一个例子,我如何在Java中实现这样的(通用)堆栈?

Java – 新的Stack 相当于通用数据类型Stack 的新Stack ?

new Stack[N]等同于通用数据类型Stack new Stack[N] ? 编辑:虽然我明白混合generics类型和数组应该最好避免,并且存在更强大的解决方案,我的查询仍然存在:广泛认可的教科书,如由韦恩和罗伯特塞奇威克(第158页)的算法,第4版建议使用构造如下: Stack[] a = (Stack[]) new Stack[N];

方法重载时重复的方法

以下代码提供编译错误,错误“重复方法” static int test(int i){ return 1; } static String test(int i){ return “abc”; } 这是预期的,因为重载方法具有相同的签名并且仅在返回类型方面不同。 但是下面的代码编译好了警告: static int test1(List l){ return 1; } static String test1(List l){ return “abc”; } 因为,我们知道Java Generics在Erasure上运行,这意味着在字节码中,这两种方法具有完全相同的签名,并且与返回类型不同。 更令我惊讶的是,以下代码再次出现编译错误: static int test1(List l){ return 1; } static String test1(List l){ return “abc”; } 如果有重复的方法,第二个代码如何正常工作而不会给出任何编译错误?

回归collections vs Collection

这两种方法有什么区别? Collection getTypes(); VS Collection getTypes(); 如果Type是类或接口,这是否重要? 特别是,在设计API时,首选哪个版本以及为什么?