Java 将泛型类中的方法约束到特定类型
下面的代码段未编译;我有一个泛型类,它有一个映射,从泛型键K映射到float。我的大多数方法都以一种真正通用的方式处理这个映射 此外,我希望允许使用升序整数值初始化映射。显然,这需要我将该方法仅约束为K=整数。不幸的是,我得到了以下错误: 类型映射中的方法put(K,Float)不适用于参数(K扩展整数,Float) 非常感谢您的帮助Java 将泛型类中的方法约束到特定类型,java,generics,dictionary,Java,Generics,Dictionary,下面的代码段未编译;我有一个泛型类,它有一个映射,从泛型键K映射到float。我的大多数方法都以一种真正通用的方式处理这个映射 此外,我希望允许使用升序整数值初始化映射。显然,这需要我将该方法仅约束为K=整数。不幸的是,我得到了以下错误: 类型映射中的方法put(K,Float)不适用于参数(K扩展整数,Float) 非常感谢您的帮助 public class MyClass<K> { Map<K,Float> myMap; <K extends
public class MyClass<K> {
Map<K,Float> myMap;
<K extends Integer> MyClass(int size){
distribution = new HashMap<K,Float>();
Integer bar = 0;
while(bar<size){
Float rnd = ThreadLocalRandom.current().nextFloat();
myMap.put(bar,rnd);
bar++;
}
}
}
公共类MyClass{
地图我的地图;
MyClass(整数大小){
distribution=newHashMap();
整条=0;
而(bar可以扩展类并为基类指定参数类型:
class MyClass<K> {
Map<K,Float> myMap;
}
class Derived extends MyClass<Integer>{
void SparsePDT(int size){
myMap = new HashMap<Integer,Float>();
Integer bar = 0;
while(bar<size){
Float rnd = ThreadLocalRandom.current().nextFloat();
myMap.put(bar,rnd);
bar++;
}
}
}
class-MyClass{
地图我的地图;
}
派生类扩展MyClass{
空心SparsePDT(内部尺寸){
myMap=newhashmap();
整条=0;
而(bar可以扩展类并为基类指定参数类型:
class MyClass<K> {
Map<K,Float> myMap;
}
class Derived extends MyClass<Integer>{
void SparsePDT(int size){
myMap = new HashMap<Integer,Float>();
Integer bar = 0;
while(bar<size){
Float rnd = ThreadLocalRandom.current().nextFloat();
myMap.put(bar,rnd);
bar++;
}
}
}
class-MyClass{
地图我的地图;
}
派生类扩展MyClass{
空心SparsePDT(内部尺寸){
myMap=newhashmap();
整条=0;
而(bar作为子类的另一种方式是使用静态创建方法:
class MyClass<K> {
private final Map<K, Float> myMap;
public MyClass() {
myMap = new HashMap<>();
}
public static MyClass<Integer> create(int size) {
MyClass<Integer> result = new MyClass<>();
for(int i = 0; i < size; i++) {
Float rnd = ThreadLocalRandom.current().nextFloat();
result.myMap.put(bar,rnd);
}
return result;
}
}
class-MyClass{
私人最终地图myMap;
公共MyClass(){
myMap=newhashmap();
}
公共静态MyClass创建(整数大小){
MyClass结果=新建MyClass();
对于(int i=0;i
作为子类的另一种方法是使用静态创建方法:
class MyClass<K> {
private final Map<K, Float> myMap;
public MyClass() {
myMap = new HashMap<>();
}
public static MyClass<Integer> create(int size) {
MyClass<Integer> result = new MyClass<>();
for(int i = 0; i < size; i++) {
Float rnd = ThreadLocalRandom.current().nextFloat();
result.myMap.put(bar,rnd);
}
return result;
}
}
class-MyClass{
私人最终地图myMap;
公共MyClass(){
myMap=newhashmap();
}
公共静态MyClass创建(整数大小){
MyClass结果=新建MyClass();
对于(int i=0;iSparsePDT
方法o中没有return
。您知道,Integer
被声明为final
?@Itamagreen谢谢,在将其简化为玩具示例之前,这只是一个伪制品。该方法实际上是一个构造函数。@F.Lumnitz我知道。或者,我也可以使用一个非final类型,可以迭代。在SparsePDT
方法中没有return
。您知道,Integer
被声明为final
?@Itamagreen谢谢,在将其简化为玩具示例之前,这只是一个伪制品。该方法实际上是一个构造函数。@F.Lumnitz我知道。或者,我也可以使用一个可以在C++ C++中java语言中的唯一的替代方法是扩展“类”——在java泛型中,C++中的功能不那么强大。这是因为它们被很快地包含在这个语言中,java是向后兼容的。如果你想让你的类“MyClass”完全通用,这个解决方案(类似)在C++中,我将我的方法用“模板”来定义——扩展类是java中唯一的替代品。java泛型中的C++功能不那么强大。这是因为它们被很快地包含在这个语言中,java是向后兼容的。如果你想让你的类“MyClass”完全通用的,这个解决方案(和类似的)是我唯一想到的。