我一直在阅读Herbert Schildt撰写的“ Java。初学者指南”。在一页上有关通用接口的部分中,作者写道(强调我的意思):
任何实现通用接口的类本身必须是通用的。
然后在下一页上(强调我的意思):
通用,如果一个类实现了通用接口,则该类也必须是通用,至少要采用传递的类型参数进入界面。
那么在非泛型类可以在Java中实现泛型接口的任何特定情况下吗?还是所有此类都具有通用性,因为它们从通用接口“继承”了通用性?
UPD::我应该进一步阅读本节。作者继续指出:
当然,如果是类,则实现特定类型的通用接口,例如此处所示:
class MyClass implements Containment<Double> {
则实现类不必是通用的。
我相信,这是我帖子的所有答案的要旨。
答案 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