java - 在 Java 中组合泛型类型

标签 java generics types

我在意想不到的情况下遇到了类型不匹配错误。

public interface I {}

public abstract class C {}

public class A extends C implements I {}

public class B extends C implements I {}

public class Foo {

    public <T extends C & I> T getComposition(String selector) {
        switch (selector) {
            case "a": return new A(); // type-mismatch!
            case "b": return new B(); // type-mismatch!
        }
    }

}

为什么既是C又是IA不能作为T返回?

最佳答案

符号<T extends C & I>意味着 T是一个类型参数。这意味着当有人调用该函数时,他们必须指定此类型。唯一的限制是类型扩展 CI . A就是这样一种类型,但我可以创建一个新类,它也扩展 CI .像这个例子:

class B extends C implements I {}

Foo foo = new Foo();
B b = foo.<B>getComposition();

如果您的示例已编译,这将导致异常,因为 AB 的类型不同.

如果你真的只想返回一个 A ,您需要删除通用参数并使返回类型为 A直接地。像这样:

public class Foo {
    public A getComposition() {
        return new A();
    }
}

关于java - 在 Java 中组合泛型类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42157034/

相关文章:

arrays - 具有通用2D数组的通用函数

c# - 通用协变和逆变

java - hibernate 和货币精度

haskell - 意外的重叠实例错误

java - 面向方面的编程 - 什么是 'cflow' ?

java - 从数组中删除数字

java - Flash WebSockets 后备和 Jetty 8?

java - 如何使用 Spring Framework 在 RabbitMQ Java 配置类中设置多个主题?

java - 原始类型没有警告

java - 我有一个带有 1 个 setter 方法的抽象类 - 参数是一个对象。我想要一个通用的 <T> 参数,它采用扩展它的类的类型