【问题标题】:Implementing and using a generic, abstract interface in Java在 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 方法。

标签: java generics interface abstract


【解决方案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';
        
    }
}

【讨论】:

    猜你喜欢
    • 2013-01-30
    • 1970-01-01
    • 2014-02-05
    • 2020-10-20
    • 1970-01-01
    • 2012-01-20
    • 2011-11-20
    • 2014-08-18
    • 1970-01-01
    相关资源
    最近更新 更多