Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/381.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_Reflection - Fatal编程技术网

java返回对象中的泛型返回类型

java返回对象中的泛型返回类型,java,generics,reflection,Java,Generics,Reflection,我有一个方法,允许SDK的使用者从内部存储中提取对象。这些对象继承自泛型类的基类。对象的真实类型是确定性的,并且只有消费者知道。设置如下所示: public class MyBaseClass<T> { ... } public class TheBaseClassContainer { private Map<String, MyBaseClass> container; public <T extends MyBaseClass>

我有一个方法,允许SDK的使用者从内部存储中提取对象。这些对象继承自泛型类的基类。对象的真实类型是确定性的,并且只有消费者知道。设置如下所示:

public class MyBaseClass<T> {
    ...
}

public class TheBaseClassContainer {
    private Map<String, MyBaseClass> container;

    public <T extends MyBaseClass> T getOne(String id, Class<T> clazz) {
        return clazz.cast(this.container.get(id));
    }
}
我得到一个编译失败消息,说container.getOne返回的是MyBaseClass类型,而赋值需要的是MyBaseClassSubclass类型的对象。为什么会发生这种情况?

适用于我,伙计:

    class MyBaseClass<T> {
}

class B extends  MyBaseClass<Integer>{}

class TheBaseClassContainer {
    private Map<String, MyBaseClass> container;

    public <T extends MyBaseClass> T getOne(String id, Class<T> clazz) {
        return clazz.cast(this.container.get(id));
    }
}

用Java 7编译。

给出准确的错误消息。请注意,
MyBaseClass
是通用的。您应该参数化它的使用。
    class MyBaseClass<T> {
}

class B extends  MyBaseClass<Integer>{}

class TheBaseClassContainer {
    private Map<String, MyBaseClass> container;

    public <T extends MyBaseClass> T getOne(String id, Class<T> clazz) {
        return clazz.cast(this.container.get(id));
    }
}
    TheBaseClassContainer theBaseClassContainer = new TheBaseClassContainer();
    B asd = theBaseClassContainer.getOne("asd", B.class);