Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/343.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 将泛型类中的方法约束到特定类型_Java_Generics_Dictionary - Fatal编程技术网

Java 将泛型类中的方法约束到特定类型

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

下面的代码段未编译;我有一个泛型类,它有一个映射,从泛型键K映射到float。我的大多数方法都以一种真正通用的方式处理这个映射

此外,我希望允许使用升序整数值初始化映射。显然,这需要我将该方法仅约束为K=整数。不幸的是,我得到了以下错误:

类型映射中的方法put(K,Float)不适用于参数(K扩展整数,Float)

非常感谢您的帮助

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;i
SparsePDT
方法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”完全通用的,这个解决方案(和类似的)是我唯一想到的。