非泛型类可以实现泛型接口吗?

时间:2019-01-22 20:52:04

标签: java generics interface

我一直在阅读Herbert Schildt撰写的“ Java。初学者指南”。在一页上有关通用接口的部分中,作者写道(强调我的意思):

  

任何实现通用接口的类本身必须是通用的

然后在下一页上(强调我的意思):

  

通用,如果一个类实现了通用接口,则该类也必须是通用,至少要采用传递的类型参数进入界面。

那么在非泛型类可以在Java中实现泛型接口的任何特定情况下吗?还是所有此类都具有通用性,因为它们从通用接口“继承”了通用性?

UPD::我应该进一步阅读本节。作者继续指出:

  

当然,如果是类,则实现特定类型的通用接口,例如此处所示:   class MyClass implements Containment<Double> {   则实现类不必是通用的。

我相信,这是我帖子的所有答案的要旨。

3 个答案:

答案 0 :(得分:4)

如果提供了类型参数,则可以创建一个实现泛型接口的非泛型类。

一个相对简单的例子:

public class LocalDateParser implements Function<String, LocalDate> {
    public LocalDate apply (String s) {
        return LocalDate.parse(s);
    }
}

当然,您只能将此类的实例分配给Function<String, LocalDate>,而不能分配给任何其他Function<T, R>

答案 1 :(得分:2)

我认为作者在两个陈述中都是错误的。泛型类是接受泛型类型参数的类。您可以创建一个不接受任何实现通用接口的通用类型参数的类:

public class CaseInsensitiveComparator implements Comparator<String> {

    @Override
    public int compare(String s1, String s2) {
        return s1.compareToIgnoreCase(s2);
    }
}

实际上,该类已经在JDK中存在,尽管实现方式有所不同。有关更多详细信息,请参见String.CASE_INSENSITIVE_ORDER

答案 2 :(得分:2)

您正在阅读的指南有误。

有许多实现通用接口的非通用类的例子。

最常见的是Comparable<T>。 Java 8 Javadoc列出了152个实现类,这些实现类很少传递给接口通用类型参数,因为它们都应该将自己指定为Comparable的参数,例如

public final class String implements Serializable, Comparable<String>, CharSequence
public final class Integer extends Number implements Comparable<Integer>
public final class Instant implements Temporal, TemporalAdjuster, Comparable<Instant>, Serializable