【问题标题】:Generics bounded parameter not applied for interface泛型有界参数不适用于接口
【发布时间】:2019-03-08 19:21:13
【问题描述】:

下面是我声明了两个方法的代码,它们的返回类型是有界参数,但一个是基于接口的,而另一个是基于类的。在 test() 方法中,对于有界参数从预期的 Class 扩展的方法,将返回类型分配给 String 失败,但是当有界参数基于接口时,编译器不会抛出错误。你能解释一下为什么会这样吗?

import java.io.FileInputStream;
import java.util.function.Predicate;

public class Dummy
{
    <T extends Predicate<String>> T getBoundedByInterface()
    {
        return null;
    }

    <T extends FileInputStream> T getBoundedByClass() {
        return null;
    }
    public void test()
    {
        String compilationError = getBoundedByClass(); //Expected
        String works = getBoundedByInterface(); //No compilation error. Why?

    }
}

【问题讨论】:

标签: java generics bounded-types


【解决方案1】:

Java 编译器将确定变量类型是否可以满足被调用方法的通用返回类型。对于像FileInputStream 这样的类,它知道没有一个类可以同时是FileInputStreamString,因为一个类不能从多个类继承,所以这是不允许的。此外,我们知道String 也是final,但这并不包含在编译器的逻辑中。

但是,通过接口,子类可以扩展边界并成为另一个类的子类。

class Thing extends FileInputStream implements Predicate<String> {
    // Implementation
}

因为这个原因编译。

Thing works = getBoundedByInterface();

请注意,它也适用于 String,因为编译器没有考虑到 Stringfinal

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-12-21
    • 1970-01-01
    • 1970-01-01
    • 2023-03-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多