Java 泛型 : <B extends BaseB> does not match <? 扩展 BaseB>

标签 java generics

我有两个同构类型层次结构。第一个的基类型是BaseA,第二个的基类型是BaseB。我知道如何将 BaseB 的任何子类的任何对象转换为其相应的 BaseA 子类型。我想实现一个方法,该方法采用 BaseB 类型的对象确定其类并构造 BaseA 相应子类型的对象。示例代码:

public interface BaseA...
public interface BaseB...
public class DerA implements BaseA...
public class DerB implements BaseB...
...
public interface Transform<A,B> {
    A toA (B b);
}

public class DerAtoDerB implements Transform<DerA,DerB> {
    DerA toA (DerB b){...}
}

public class Transformations {
    private static Map<Class<?>, Transform<? extends BaseA, ? extends BaseB>> _map = 
        new HashMap<>();
static {
    _map.put(DerB.class, new DerAtoDerB());
    }

public static <B extends BaseB> BaseA transform(B b){
    Transform<? extends BaseA, ? extends BaseB> t = _map.get(b.getClass());
    return t.toA(b); // Compile error: Transform<A,B#2> cannot be applied to given types
}

为什么 <B extends BaseB><? extends BaseB> 不兼容?另外,如果我尝试像这样实现静态转换方法:

public static BaseA transform(BaseB b){
    Transform<? extends BaseA, ? extends BaseB> t = _map.get(b.getClass());
    return t.toA(b); // Compile error: Transform<A,B> cannot be applied to given types
}

我得到一个编译错误:Transform<A,B> cannot be applied to given types

谁能解释一下我在泛型方面做错了什么?

最佳答案

问题是在 transform 方法中,编译器无法知道类型参数 B extends BaseBTransform< 中的第二个类型参数 类(? extends BaseB)从映射中获取实际上表示BaseB相同 子类。没有什么可以阻止您在映射中存储不兼容的类型:

_map.put(DerB.class, new AnotherDerAtoAnotherDerB()); // the types don't match

是保证映射中的类型匹配的人,因此您需要通过转换为正确的类型来告诉编译器:

@SuppressWarnings("unchecked")
public static <B extends BaseB> BaseA transform(B b) {
  Transform<? extends BaseA, B> t = 
    (Transform<? extends BaseA, B>)_map.get(b.getClass());
  return t.toA(b);
}

关于Java 泛型 : <B extends BaseB> does not match <? 扩展 BaseB>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26275665/

相关文章:

java - 改造泛型类型调用方法

c# - 为什么 Nullable<T> 被视为结构而不是类?

java - 在运行时获取数组类名的安全方法是什么?

java - 当我尝试在 netbeans 上运行 GUI 时,它说没有可用的类,我该怎么办?

java - Ubuntu 16.04 LTS - 如何为 perf 工具启用符号

java - 如何让 swing 应用程序知道屏幕尺寸的变化?

java - 未能使用 User 对象作为参数?在 Java 泛型中扩展 User

java - 如何找到文件下载到的android目录

java - 抽象类与私有(private)构造函数

Java - 是否存在协变和逆变?