在Java中编写泛型类型

时间:2017-02-10 10:27:10

标签: 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!
        }
    }

}

为什么A(同时为CI)无法返回T

2 个答案:

答案 0 :(得分:4)

符号<T extends C & I>表示T类型参数。这意味着当有人调用该函数时,他们必须指定此类型。唯一的限制是类型扩展为CIA就是这样一种类型,但我可以创建一个同样扩展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();
    }
}

答案 1 :(得分:1)

你是对的但只是一部分。 A或B是T,绝对正确。但是T本身根本不是A或B.例如。我有另一个叫D的类,D扩展A.所以,D也是T.如果你说T是A,你也意味着D是A.这根本不正确,因为D是A的子类型。