java - 关于Java泛型的一些问题

标签 java generics type-mismatch

假设我有以下接口(interface)和实现类:

interface Foo<FooType extends Foo<FooType>> {
    FooType copy();
}

class Bar implements Foo<Bar> {
    public Bar copy() {
        return new Bar();
    }       
}

如果我尝试这样做:

public <FooType extends Foo<FooType>> FooType getFoo() {
    return new Bar();
}

我收到编译错误“类型不匹配:无法从 Bar 转换为 FooType”。 为什么?

我可以通过重写函数来“修复”这个问题,如下所示:

@SuppressWarnings("unchecked")
public <FooType extends Foo<FooType>> FooType getFoo() {
    return (FooType) new Bar();
}

但是假设我有一个这样的函数:

public <FooType extends Foo<FooType>> void printFoo(FooType foo) {
    System.out.println(foo.toString());
}

如果我尝试这样做:

printFoo(getFoo());

我收到以下编译错误:

Bound mismatch: The generic method printFoo(FooType) is not applicable 
for the arguments (Foo<Foo<FooType>>). The inferred type Foo<Foo<FooType>> 
is not a valid substitute for the bounded parameter <FooType extends Foo<FooType>>

WAT? getFoo() 的返回类型实际上与 printFoo() 的参数类型相同!

是这些错误还是我遗漏了什么?

最佳答案

问题是 FooType可以是任何东西,不仅仅是 Bar 。您可以返回 FooType 的实例.

例如如果您有class NotBar implements Foo<NotBar> {那么

 obj.<NotBar>getFoo();

现在是 FooType 的实际参数是 NotBar .

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

相关文章:

java - 从 List<Byte> 获取 byte[]

java - 无法在 log4j2 中使用 RollingFileAppender 写入日志

scala - 在 for 理解中将选项与列表组合会导致类型不匹配,具体取决于顺序

loops - 运行 VBA 代码以根据特定条件删除行时出现类型不匹配错误

java - 使用 JSF2.0 和 Primefaces 3.4 进行导航

java - 如何在表中以编程方式选择插入的行?

java - 将列表作为参数传递给 java.lang.reflect.Method

vba - 类型不匹配错误-图表数据

java - 可以将泛型添加到 Java 中非泛型接口(interface)的实现中吗?

java - 在不同的类中使用在一个类中创建的类型参数