Java参数化方法返回值类型

标签 java generics

考虑以下代码:

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/

相关文章:

java - Guava 函数 toByteArray() 返回 null?

java - java源文件中的主类?

java - 没有堆栈跟踪的嵌入式 neo4j 崩溃

java - Tomcat9 提示找不到 javax.sql.DataSource 类的类

java - ArrayList.get(index) 不返回变量?

generics - Kotlin 泛型类型参数

swift - 带开关的通用功能

Java 泛型 - 在方法参数中使用封闭类的泛型类型参数

java - 有没有办法在调用泛型/参数化方法时强制提供类型参数?

swift - Swift is Operator 的意外结果