在 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 类可能应该覆盖Predicatetest 方法。 【参考方案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 中实现和使用通用的抽象接口的主要内容,如果未能解决你的问题,请参考以下文章

2021年最新大厂Java面试笔试题目,通用流行框架大全

java.sql.ResultSet、CallableStatement、SQLInput 没有通用接口

[转]java抽象类和接口

应用抽象工厂+反射实现通用数据源的设计

java编程思想第九章接口

Java抽象类与接口的区别