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

Cheng Chen

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

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)

艾哈迈德·马泽(Ahmed Mazher)

课:吉拉德·布拉查(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);因此当您覆盖它时,编译器不会抱怨

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

为什么List使用显式接口方法实现来实现非泛型接口方法?

来自分类Dev

为什么Java泛型无法实现接口?

来自分类Dev

从 Java 接口实现泛型方法

来自分类Dev

接口方法Java中的泛型类型

来自分类Dev

如何实现接口泛型方法

来自分类Dev

如何实现接口泛型方法

来自分类Dev

用泛型java实现接口

来自分类Dev

在Java中使用泛型和反射实现接口方法

来自分类Dev

如何在F#中实现具有方法返回Task(非泛型)的接口

来自分类Dev

Java泛型中的接口实现传播

来自分类Dev

非泛型方法是否可以返回泛型类型?

来自分类Dev

通过泛型在java中制作泛型接口

来自分类Dev

为什么泛型中未指定的类型会破坏非泛型方法的类型安全性

来自分类Dev

实现接口的泛型列表

来自分类Dev

泛型的实现方法

来自分类Dev

UICollectionviewcell 的子类无法实现为泛型

来自分类Dev

非泛型类中的泛型方法

来自分类Dev

C ++:泛型类中的非泛型方法?

来自分类Dev

非泛型类中的泛型方法

来自分类Dev

为什么实现具有类型约束的泛型接口的泛型类需要重复这些约束?

来自分类Dev

Java中的泛型,扩展接口

来自分类Dev

Java 中的泛型或继承/接口?

来自分类Dev

为什么将显式类型参数赋予非泛型方法或构造函数?

来自分类Dev

如果泛型类型约束还必须在c#中实现接口,则类类型约束将实现什么?

来自分类Dev

如何在Java中实现泛型方法

来自分类Dev

在特性和方法中实现泛型

来自分类Dev

为什么 Java 泛型不能用于静态方法?

来自分类Dev

与泛型类型方法的接口

来自分类Dev

Java泛型接口转换