首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Java中组合泛型类型

在Java中组合泛型类型
EN

Stack Overflow用户
提问于 2017-02-10 18:27:10
回答 2查看 180关注 0票数 4

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

代码语言:javascript
复制
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返回

EN

回答 2

Stack Overflow用户

发布于 2017-02-10 18:32:58

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

代码语言:javascript
复制
class B extends C implements I {}

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

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

如果您真的想只返回一个A,则需要删除泛型参数,并直接将返回类型设置为A。如下所示:

代码语言:javascript
复制
public class Foo {
    public A getComposition() {
        return new A();
    }
}
票数 4
EN

Stack Overflow用户

发布于 2017-02-10 19:27:10

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42157034

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档