Tag: generics

从Java中的generics类型推断generics类型(编译时错误)

我有一个静态函数,带有以下签名的generics类型T public static List sortMap(Map map) 应返回带有某些属性的地图键列表。 现在我想传递S类型的通用HashMap Map map 在generics类中调用静态函数,该类具有映射作为成员变量。 我在下面列出了一个最小的代码示例。 但是,我收到一条错误消息( S和T都是T,但在我的代码的不同范围内,即T#1 = T , T#2 = S ): required: Map found: Map reason: cannot infer type-variable(s) T#1 (argument mismatch; Map cannot be converted to Map) 怎么解决这个问题? 我很惊讶Java不允许从generics类型推断generics类型。 Java中的哪种结构可以用来处理那种更抽象的代码推理? 代码 : public class ExampleClass { Map map; public ExampleClass () { this.map = […]

如何通过枚举管理generics?

我有一个参数化的界面: public interface MyInterface { void run(T e); } 和实现接口的类: public class MyClass1 implements MyInterface { public void run(SomeOtherClass1 e) { // do some stuff with e } } public class MyClass2 implements MyInterface { public void run(SomeOtherClass2 e) { // do some stuff with e } } 不同的MyClass * X *的数量是已知且详尽的,并且每个MyClass * X *只有一个实例,所以我想使用枚举: […]

具有相同擦除的两种方法不是必须覆盖等效的(或者它们之间的签名不是子签名)?

我正在为jdk6阅读令人难以置信的书“java scjp认证的程序员指南”,以及关于generics覆盖的部分。 在它上面描述了subsignature和override-equivalent,并描述了我引用的覆盖等价的一些例子: 给定以下三个类中的generics方法声明: static void merge (MyStack s1, MyStack s2) { /*…*/ } static void merge (MyStack s1, MyStack s2) { /*…*/ } static void merge (MyStack s1, MyStack s2) { /*…*/ } 擦除后,所有三种方法的签名是: merge(MyStack, MyStack)即方法的签名是覆盖等价的,因此这些方法不会重载。 我并不完全同意这些方法是覆盖等价的,事实上我认为这些方法有一个“擦除名称冲突”,但没有一个是另一个的子签名……可能是错误的,所以我想对此有所了解。 子签名的定义让我觉得它们不是它们之间的子签名。 在JSL 6#8.4.2方法签名中( http://docs.oracle.com/javase/specs/jls/se6/html/classes.html#8.4.2 ) 如果两个方法具有相同的名称和参数类型,则它们具有相同的签名。 如果满足以下所有条件,则两个方法或构造函数声明M和N具有相同的参数类型: 他们。 具有相同数量的forms参数(可能为零) 它们具有相同数量的类型参数(可能为零) 设为M的forms类型参数,并让为N的forms类型参数。将N的类型中每个出现的Bi重命名为Ai的边界对应的类型变量和M和N的参数类型是相同的。 如果m2与m1具有相同的签名,或者m1的签名与m2的签名擦除相同,则方法m1的签名是方法m2的签名的子签名。 … 如果m1是m2的子签名或m2是m1的子签名,则两个方法签名m1和m2是覆盖等价的。 在JSL 8#8.4.2中。 方法签名( […]

为什么我不能初始化Map ?

我想存储一组int / String值,但int不一定是增量的,这意味着数据可以是: , , . 所以我正在尝试创建一个Dictionary的c#等价物,但它只是无法编译,说“令牌上的语法错误”int“,此符号后面的维度”在该行上: private Map courses; 谁能告诉我为什么会这样? 还有一个很好的替代方法,可以创建一个对象作为int和String的占位符,然后使用数组来存储它们?

在Java类型参数中,仅指严格的亚型? 还是E也足够了?

在Java类型参数中,是否仅指严格的子类型? 还是E也足够了?

如何在Java中对generics类型列表进行排序

我有一组所有共享一些共同属性的类,所以我让它们都扩展了一个共同的基类BaseEntity 。 所以我有,例如Foo extends BaseEntity和Bar extends BaseEntity 。 我还希望这些Foo和Bar对象的列表是可排序的,所以我已经实现了Comparable 。 我将类定义为Foo extends BaseEntity implements Comparable和Bar extends BaseEntity implements Comparable ,并且Foo或Bar的列表的排序按预期工作 – 当然,排序的细节是不同的在不同的子类中。 但是,当我事先不知道我是否会有Foo或Bar时,我无法弄清楚如何进行分类工作。 例如,此代码无法编译: public class UtilityClass { …bunch of stuff… List values; public List sort() { Collections.sort(values); return values; } …more methods… } 错误消息Bound mismatch: The generic method sort(List) of type Collections is not […]

使用generics的静态方法重载

在我尝试创建两个静态重载方法的地方,我遇到了编译错误。 谁能解释一下呢 public class A { public static void a(Set stringSet) {} public static void a(Set<Map> mapSet) {} }

Javagenerics和数字类型

我想创建一个有效的通用方法: class MyClass { static T sloppyParseNumber(String str) { try { return T.valueOf(str); } catch (Exception e) { return (T)0; } } } 现在上面没有编译有两个原因:没有Number.valueOf()方法,0不能转换为T 用法示例: String value = “0.00000001”; System.out.println(“Double: ” + MyClass.sloppyParseNumber(value)); System.out.println(“Float: ” + MyClass.sloppyParseNumber(value)); double d = MyClass.sloppyParseNumber(value); float f = MyClass.sloppyParseNumber(value); 用Java实现上面的通用方法吗? 如果有,怎么样? 如果不是,有什么好的替代方法? 编辑:似乎有一些可能的重复,但我没有找到一个,它涵盖了这一点。 我希望有一些技巧可以提取,这将允许这两个操作:将字符串解析为Number子类,并为Number子类返回0值。

Javagenerics:非法的前向引用

给定一个通用接口 interface Foo { } 我想编写一个实现,要求A成为B的子类。所以我想这样做 class Bar implements Foo { } // –> Syntax error 要么 class Bar implements Foo { } // –> illegal forward reference 但似乎有效的唯一解决方案是: class Bar implements Foo { } 这有点难看,因为它颠倒了通用参数的顺序。 这个问题有什么解决方案或解决方法吗?

具有上限的通配符类型变量的迭代器

大家好,我尝试扩展HashMap来强制执行“全小写”规则 public class HttpQueryMap extends HashMap { … @Override public void putAll(Map m) { … Iterator<Map.Entry> iterator = m.entrySet().iterator(); … } … } 我收到编译时错误 incompatible types required: Iterator<Entry> found: Iterator<Entry> where CAP#1,CAP#2 are fresh type-variables: CAP#1 extends String from capture of ? extends String CAP#2 extends String from capture of ? extends String 下一个解决方案可以完成这项工作,但实际上很丑陋: public […]