【问题标题】:Do you think class string implements interface comparable in Java你认为类字符串在Java中实现了可比的接口
【发布时间】:2015-11-02 03:29:02
【问题描述】:

我这样做是为了我自己的理解,我不明白这个问题。

假设有一个与以下名称相当的接口 定义:

public interface Comparable { 
        int compareTo(Object obj);
     }

你认为 String 类实现了 Comparable 接口吗?提供一个 你回答的原因。

我会说不,因为课堂上没有字符串,但我相信我误解了这个问题。有人可以为我解释一下吗?

【问题讨论】:

  • docs.oracle.com/javase/7/docs/api/java/lang/String.html - 但我想这个问题是针对你的解释......你在那门课程中使用的是旧版本的 Java 吗?
  • 我也不明白这个问题。你必须猜测 String 是否实现了这个接口?
  • 你被要求考虑给定的Comparable 接口,然后就String 是否可以或应该实现它给出你有根据的意见。
  • 确切的答案取决于几件事:这是我们正在谈论的java.lang.Comparable 还是另一个同名的接口,无论我们是否是 Java 5 之前的版本。跨度>

标签: java class interface


【解决方案1】:

您应该查看String 类的源代码或Java 文档。它显式实现了接口Comparable。

http://docs.oracle.com/javase/7/docs/api/java/lang/String.html

java.lang

类字符串

java.lang.Object

java.lang.String

所有实现的接口:

Serializable、CharSequence、Comparable

【讨论】:

    【解决方案2】:

    我将为这个问题提供其他观点,我会说不,它没有。

    从 Java 6 开始,java.lang.String 无法实现该接口,因为它与Comparable<String> 不兼容,并且Comparable 与Comparable<String> 不同。区别在于您不能将String 与Object 进行比较

    【讨论】:

    • 我刚刚阅读了http://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html 的文档,它说您需要一个参数化参数,是的,我刚刚尝试过
    • 只是因为泛型使它比这稍微复杂一些。例如,Comparable foo = "foo"; 将编译。但是,如果您随后运行foo.compareTo(new Object()),您将在运行时获得ClassCastException。而"foo".compareTo(new Object()) 甚至不会编译。这与类型擦除的工作方式有关。重要的是,您不能将 String 与任何对象进行比较,它会在编译时或运行时失败。
    • 您的第一个示例将编译,但您会收到警告,告诉您正在使用原始数据,ClassCastException 是使用错误参数的结果。事实上,如果你完成了Comparable<String> foo = "foo",它也不会编译。
    • 是的,但是严格来说,您可以将String 转换为Comparable,这意味着String 实现了Comparable。 (事实上​​确实如此,如果你反编译类文件,你会在其中看到一个public boolean compareTo(Object) 方法。)但是编译器会尽力阻止你将字符串与任何非字符串对象进行比较。
    【解决方案3】:

    String 实现 Comparable。

    Why it does so?
    

    因此可以使用 compareTo 方法对字符串进行排序。 例如,您想根据员工的姓名对员工进行排序,而姓名是字符串,因此您可以将其用作:-

     import java.util.ArrayList;
    import java.util.Collections;
    import java.util.Iterator;
    import java.util.List;
    
    public class Employee implements Comparable {
    
        String name;
    
        public Employee(String name) {
            this.name = name;
        }
    
        public int compareTo(Object o) {
            Employee employeeAnother = (Employee) o;
            // natural alphabetical ordering by type
            // if equal returns 0, if greater returns +ve int,
            // if less returns -ve int
            return this.name.compareTo(employeeAnother.name);// String compareTo is
                                                                // called here
        }
    
        public static void main(String[] args) {
            List list = new ArrayList();
            list.add(new Employee("Ramesh"));
            list.add(new Employee("Deepak"));
            list.add(new Employee("Vivek"));
            Collections.sort(list); // sorts using compareTo method
            for (Iterator iter = list.iterator(); iter.hasNext();) {
                Employee employee = (Employee) iter.next();
                System.out.println(employee);
            }
        }
    
        public String toString() {
            return name;
        }
    } 
    

    我没有使用泛型来保持简单。您会收到很少的警告,但您可以忽略这些。

    【讨论】:

      【解决方案4】:

      如果您想检查给定的类是否实现了某些接口或其他类,您可以使用instanceof:

      System.out.println("string" instanceof Comparable);
      

      您也可以尝试从给定接口执行方法:

      "one".compareTo("two")
      

      在这种情况下,您的代码将编译或显示相应的错误消息。


      但是最好的方法是阅读给定类的源代码。在这种情况下,您不必编写任何额外的代码。此外,一个好的 IDE(如 Eclipse、Intellij Idea)可以帮助找到答案。

      【讨论】:

        【解决方案5】:

        是的! 在 Java 8 中;打开 Java 文档,你会发现如下:

        public final class String
            implements java.io.Serializable, Comparable<String>, CharSequence
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2014-03-04
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多