考虑以下代码:
class ExtType extends MyType{};
class MyClass {
MyType myField;
public <T extends MyType> T foo(Class<T> clazz) {
return (T)myField;
}
}
现在我想调用 foo
方法,我可以通过两种方式执行此操作:
1 种方式:
(new MyClass()).foo(ExtType.class);
两种方式:
(new MyClass()).<ExtType>foo(ExtType.class);
有趣的是,即使该方法被声明为参数化,Eclipse 也不会发出问题 1 个调用中出现任何警告。
这是我的问题,在第一个代码片段中,哪个 T
用于转换返回值。
是来自参数的 T
还是来自返回值的 T
?为什么如果我没有明确指定返回类型(如“1 way”),则不会发出警告?
最佳答案
通常使用参数类型,但如果定义了返回类型(如方式 2),编译器也会检查它。
如果没有参数来获取 T
的类型,则需要返回类型声明from,这称为类型推断。因此你甚至可以写:
public <T extends MyType> T foo() {
return (T)myField;
}
ExtType t = (new MyClass()).foo();
在某些情况下,您需要帮助编译器并指定要使用的类型,从而获得类似 (new MyClass()).<ExtType>foo(ExtType.class);
的代码。但请注意,如果您定义不同的类型,例如(new MyClass()).<MyType>foo(ExtType.class);
,您会收到编译时错误,因为编译器现在不知道使用了哪一个。
关于Java参数化方法返回值类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10085337/