繁体   English   中英

为什么接口的泛型方法可以在Java中实现为非泛型?

[英]Why a generic method of an interface can be implemented as non-generic in Java?

假设我们有一些像这样的测试接口/类:

abstract class Plant {
    public abstract String getName();
}

interface Eatable { }

class Apple extends Plant implements Eatable {
    @Override
    public String getName() {
        return "Apple";
    }
}

class Rose extends Plant {
    @Override
    public String getName() {
        return "Rose";
    }
}

interface Animal {
    <T extends Plant & Eatable> void eat(T plant);
}

您可以看到Animal.eat是一个带约束的通用方法。 现在我的Human类是这样的:

class Human implements Animal {
    @Override
    public void eat(Plant plant) {
    }
}

编译好。 您可以看到Human.eat受到的约束比Animal.eat因为Eatable接口丢失了。

Q1:为什么编译器不抱怨这种不一致?

问题2:如果编译器接受Plant&Eatable 降级Plant ,为什么它会抱怨eat(Object plant)

课程:Gilad Bracha的仿制品据他说

 public static <T extends Object & Comparable<? super T>> T max(Collection<T> coll) 

这是使用语法T1和T2 ...&Tn为类型参数提供多个边界的示例。 已知具有多个边界的类型变量是绑定中列出的所有类型的子类型。 当使用多边界时,边界中提到的第一种类型用作类型变量的擦除。

所以你的例子<T extends Plant & Eatable> void eat(T plant); 将被删除void eat(Plant plant); 所以当你覆盖它时,编译器不会抱怨

艾哈迈德的回答是对的,顺便说一句,如果你想把约束实现Animal的接口,你应该将它声明为:

interface Animal<T extends Plant & Eatable>  {
    void eat(T plant);
}

然后,如果在不提供类型信息的情况下实现Animal接口,编译器将使用最小的意外策略将T推断为Plant类型。 但是,如果您提供必要的类型信息,编译器工作正常。

class Human implements Animal<Rose> // won't compile
class Human implements Animal<Apple> // compile

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM