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

Java参数化方法返回值类型

Java参数化方法返回值类型,java,generics,Java,Generics,考虑以下代码: class ExtType extends MyType{}; class MyClass { MyType myField; public <T extends MyType> T foo(Class<T> clazz) { return (T)myField; } } 双向: (new MyClass()).<ExtType>foo(ExtType.class); (新的MyClass()).

考虑以下代码:

class ExtType extends MyType{};

class MyClass {
    MyType myField;

    public <T extends MyType> T foo(Class<T> clazz) {
        return (T)myField;
    }
}
双向:

(new MyClass()).<ExtType>foo(ExtType.class);
(新的MyClass()).foo(ExtType.class);
有趣的是,即使方法被声明为参数化,Eclipse也不会发出 一通电话有任何警告

这里是我的问题,在第一个代码片段中,
T
s中的哪一个用于转换返回值。
它是来自参数的
T
还是来自返回值的
T
?为什么如果我没有明确指定返回类型(如“1方式”)则不会发出警告?

通常使用参数类型,但如果定义了返回类型(如方式2),编译器也会对此进行检查

如果没有参数从中获取
T
的类型,则需要返回类型声明,这称为类型推断。因此你甚至可以写:

public <T extends MyType> T foo() {
    return (T)myField;
}


ExtType t = (new MyClass()).foo();
publictfoo(){
返回(T)myField;
}
ExtType t=(新的MyClass()).foo();

在某些情况下,您需要帮助编译器并指定要使用的类型,从而获得类似
(new MyClass()).foo(ExtType.class)的代码。但是,请注意,如果要定义不同的类型,例如
(new MyClass()).foo(ExtType.class),则会出现编译时错误,因为编译器现在不知道使用的是哪一个。

当您在函数声明中定义“t”时,您还将定义它保存和返回的t类型。在您的例子中,您正在传递参数,并且期望返回类型与extensedexttype相同,并且声明为“T”。因此,eclipse不会生成任何警告。

谢谢您的回答。在case
(new MyClass()).foo()中,我说的对吗时,将不会执行
foo()
内部的强制转换,或者更准确地说,将对
对象进行强制转换?@gasan强制转换仍将发生,但将根据您分配返回值的变量类型推断
T
的类型。@Tomas,实际上,我已经使用以下代码检查了它:
public class GenericTest{static class MyType{}static class ExtType扩展MyType{};static class MyClass{MyType myField=new MyType();public T foo(){return(T)myField;}}public static void main(String[]args){ExtType t=(new MyClass()).foo();System.out.println(t);}
和ClassCastException仅在将
foo()
结果赋值给
t
foo()
执行本身无异常运行时发生。这意味着没有强制转换
foo()
。还有,可能还有另一个问题。您告诉我,除了指定参数的类型参数外,有时还需要为返回值指定类型参数,以帮助编译器确定返回类型。如果需要,您可以提供这种情况吗?@gasan否,如果您通过指定没有的参数来定义类型但如果您不这样做并且依赖类型推断,则仅嵌套此类方法可能会导致编译器无法推断类型(但在较新的编译器版本中可能会修复此问题)。
public <T extends MyType> T foo() {
    return (T)myField;
}


ExtType t = (new MyClass()).foo();