在 Java 中实现和使用通用的抽象接口
Posted
技术标签:
【中文标题】在 Java 中实现和使用通用的抽象接口【英文标题】:Implementing and using a generic, abstract interface in Java 【发布时间】:2021-12-10 23:34:27 【问题描述】:我的任务是创建一个谓词接口并实现一些实现该接口的类。例如,一个名为StartsWith
的类是泛型的,需要有一个构造函数来接受CharSequence
的子类的任何对象。
这是我目前拥有的:
谓词.java
package predicates;
interface Predicate<T>
public char StartsWith(T obj);
StartsWith.java
package predicates;
public class StartsWith<T extends CharSequence> implements Predicate<T>
@Override
public char StartsWith(T obj)
return 'a';
// TODO Auto-generated method stub
创建 StartsWith 对象的示例必须如下所示:
StartsWith<String> predicate = new StartsWith<String>("aB");
当我尝试像这样实例化一个对象时,我立即遇到一个错误,指出参数不匹配,并且我不提供任何参数以使其正确,但是,它必须以这种方式调用。
我很困惑我在这里做错了什么。
【问题讨论】:
注意:您应该遵循 Java 命名约定。方法名应该用驼峰命名,所以它以小写开头。方法StartsWith
应该是startsWith
。
你的StartsWith
类可能应该覆盖Predicate
的test
方法。
【参考方案1】:
这个
public char StartsWith(T obj)
//....
... 是一个方法 声明,不是 一个构造函数。实际上,我将其称为“伪”构造函数,因为它与类具有相同的名称。构造函数没有返回类型,没有 void,什么都没有。
这里:
StartsWith<String> predicate = new StartsWith<String>("aB");
你把它当成一个构造函数来调用,再一次,它绝对不是。
所以,...
不要给你的方法使用与构造函数相同的名称 学习和使用Java naming conventions。变量名应全部以小写字母开头,而类名应以大写字母开头。学习这一点并遵循这一点将使我们能够更好地理解您的代码,并使您能够更好地理解其他人的代码。所以,例如:
public class FooPredicate
public static void main(String[] args)
StartsWith<String> predicate = new StartsWith<String>();
System.out.println(predicate.startsWithMethod("abc"));
interface Predicate<T>
public char startsWithMethod(T obj);
class StartsWith<T extends CharSequence> implements Predicate<T>
@Override
public char startsWithMethod(T obj)
return 'a';
【讨论】:
以上是关于在 Java 中实现和使用通用的抽象接口的主要内容,如果未能解决你的问题,请参考以下文章