【发布时间】:2018-10-19 03:44:46
【问题描述】:
我遇到了这个有线问题。
class Foo<R, C> {
public C fooMethod() {
Bar bar = new Bar();
Map<String, String> m = new HashMap<>();
return bar.barMethod(m);
}
}
class Bar {
public <T> T barMethod(Map<String, String> m) {
Object barObj = null;
...
return (T) barObj;
}
}
如果我将 m 声明为原始类型 Map m = new Map(),则会出现编译错误:
不兼容的类型:对象不能转换为 C,其中 C 是 类型变量。
但如果m 是上面声明的类型化对象,那么编译错误就消失了。
我无法弄清楚为什么参数会改变编译器来确定返回类型是什么。对我来说,编译器在任何情况下都不应该认为 Bar 类示例中的泛型类型 T 是 Object 类型。有人能指出我错在哪里吗? 提前致谢。
【问题讨论】:
-
我似乎无法重现这个。
-
@JacobG。嗨 Jacob,这就是我不明白的地方,为什么类型擦除认为它是对象类型而不是泛型 C 类型?
-
有趣的是,问题不在于类型推断,因为即使使用
return bar.<C>barMethod(m);将 T 显式设置为 C 也是如此。
标签: java generics type-erasure