非泛型类能实现泛型接口吗?

3
我一直在阅读Herbert Schildt的《Java入门指南》。在泛型接口部分的一页中,作者写道(重点是我的):
任何实现泛型接口的类都必须是泛型的。
在下一页上(重点是我的):
通常情况下,如果一个类实现了一个泛型接口,那么该类也必须是泛型的,至少要具备传递给接口的类型参数的程度。
那么,在Java中是否有任何特定情况下非泛型类可以实现泛型接口?还是所有这样的类都是泛型的,因为它们从泛型接口‘继承’了这种普遍性?
更新:我应该进一步阅读该部分。作者继续陈述:
当然,如果一个类实现了特定类型的泛型接口,例如这里所示的: class MyClass implements Containment<Double> { 那么实现类不需要是泛型的。
我相信这就是对我的帖子的所有答案的要点。
3个回答

4

如果提供类型参数,可以创建实现通用接口的非泛型类。

以下是一个相对简单的例子:

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

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

啊,所以当实现特定类型的泛型接口时,实现类不需要是泛型的 - 好的。但如果在接口声明中使用了类型参数,则实现接口的类也应该声明它,对吧? - John Allison
任何时候当一个类或接口带有类型参数时,都应该提供这些参数。否则,这将带来麻烦。相关问题:【什么是原始类型,为什么我们不应该使用它?】(https://dev59.com/m3E85IYBdhLWcg3wdDIM) - Joe C

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

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

public class CaseInsensitiveComparator implements Comparator<String> {

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

实际上,这个类已经存在于JDK中,虽然它的实现方式不同。请参见String.CASE_INSENSITIVE_ORDER了解更多详情。

最初的回答:该类已在JDK中实现,详细信息请参见String.CASE_INSENSITIVE_ORDER。

1
我相信这就是Joe C.的意思。我应该再仔细阅读一下这一部分。作者接着说:“当然,如果一个类实现了一个特定类型的泛型接口,[...] 那么实现类就不需要是泛型的。”所以我认为这是一个语义问题。 - John Allison
2
@JohnAllison "必须本身是泛型" 不仅仅是语义上的错误,而是完全错误!非泛型类实现泛型接口的情况比使用相同参数的泛型类实现泛型接口的情况更多。 - Andreas

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接