2017-04-03 17 views
-2

参考下面提供的代码,在main()方法中,传递给静态sort()函数的实际参数的类型为String [](变量a),但是类型的形式参数()函数的类型为Comparable []。由于这两种类型似乎不匹配,这怎么可能?是否有某种隐式对象转换适用于我不知道的函数调用?任何帮助,将不胜感激。函数调用期间的隐式对象转换

Merge.java

下面是语法从§2.2归并强调Merge.java的版本。

/****************************************************************************** 
* Compilation: javac Merge.java 
* Execution: java Merge < input.txt 
* Dependencies: StdOut.java StdIn.java 
* 
* 
* Sorts a sequence of strings from standard input using mergesort. 
* 
* % more tiny.txt 
* S O R T E X A M P L E 
* 
* % java Merge < tiny.txt 
* A E E L M O P R S T X     [ one string per line ] 
*  
* % more words3.txt 
* bed bug dad yes zoo ... all bad yet 
* 
* % java Merge < words3.txt 
* all bad bed bug dad ... yes yet zoo [ one string per line ] 
* 
******************************************************************************/ 

/** 
* The {@code Merge} class provides static methods for sorting an 
* array using mergesort. 
* <p> 
* For additional documentation, see <a href="http://algs4.cs.princeton.edu/22mergesort">Section 2.2</a> of 
* <i>Algorithms, 4th Edition</i> by Robert Sedgewick and Kevin Wayne. 
* For an optimized version, see {@link MergeX}. 
* 
* @author Robert Sedgewick 
* @author Kevin Wayne 
*/ 
public class Merge { 

    // This class should not be instantiated. 
    private Merge() { } 

    // stably merge a[lo .. mid] with a[mid+1 ..hi] using aux[lo .. hi] 
    private static void merge(Comparable[] a, Comparable[] aux, int lo, int mid, int hi) { 
     // precondition: a[lo .. mid] and a[mid+1 .. hi] are sorted subarrays 
     assert isSorted(a, lo, mid); 
     assert isSorted(a, mid+1, hi); 

     // copy to aux[] 
     for (int k = lo; k <= hi; k++) { 
      aux[k] = a[k]; 
     } 

     // merge back to a[] 
     int i = lo, j = mid+1; 
     for (int k = lo; k <= hi; k++) { 
      if  (i > mid)    a[k] = aux[j++]; 
      else if (j > hi)    a[k] = aux[i++]; 
      else if (less(aux[j], aux[i])) a[k] = aux[j++]; 
      else       a[k] = aux[i++]; 
     } 

     // postcondition: a[lo .. hi] is sorted 
     assert isSorted(a, lo, hi); 
    } 

    // mergesort a[lo..hi] using auxiliary array aux[lo..hi] 
    private static void sort(Comparable[] a, Comparable[] aux, int lo, int hi) { 
     if (hi <= lo) return; 
     int mid = lo + (hi - lo)/2; 
     sort(a, aux, lo, mid); 
     sort(a, aux, mid + 1, hi); 
     merge(a, aux, lo, mid, hi); 
    } 

    /** 
    * Rearranges the array in ascending order, using the natural order. 
    * @param a the array to be sorted 
    */ 
    public static void sort(Comparable[] a) { 
     Comparable[] aux = new Comparable[a.length]; 
     sort(a, aux, 0, a.length-1); 
     assert isSorted(a); 
    } 


    /*************************************************************************** 
    * Helper sorting function. 
    ***************************************************************************/ 

    // is v < w ? 
    private static boolean less(Comparable v, Comparable w) { 
     return v.compareTo(w) < 0; 
    } 

    /*************************************************************************** 
    * Check if array is sorted - useful for debugging. 
    ***************************************************************************/ 
    private static boolean isSorted(Comparable[] a) { 
     return isSorted(a, 0, a.length - 1); 
    } 

    private static boolean isSorted(Comparable[] a, int lo, int hi) { 
     for (int i = lo + 1; i <= hi; i++) 
      if (less(a[i], a[i-1])) return false; 
     return true; 
    } 


    /*************************************************************************** 
    * Index mergesort. 
    ***************************************************************************/ 
    // stably merge a[lo .. mid] with a[mid+1 .. hi] using aux[lo .. hi] 
    private static void merge(Comparable[] a, int[] index, int[] aux, int lo, int mid, int hi) { 

     // copy to aux[] 
     for (int k = lo; k <= hi; k++) { 
      aux[k] = index[k]; 
     } 

     // merge back to a[] 
     int i = lo, j = mid+1; 
     for (int k = lo; k <= hi; k++) { 
      if  (i > mid)     index[k] = aux[j++]; 
      else if (j > hi)      index[k] = aux[i++]; 
      else if (less(a[aux[j]], a[aux[i]])) index[k] = aux[j++]; 
      else         index[k] = aux[i++]; 
     } 
    } 

    /** 
    * Returns a permutation that gives the elements in the array in ascending order. 
    * @param a the array 
    * @return a permutation {@code p[]} such that {@code a[p[0]]}, {@code a[p[1]]}, 
    * ..., {@code a[p[N-1]]} are in ascending order 
    */ 
    public static int[] indexSort(Comparable[] a) { 
     int n = a.length; 
     int[] index = new int[n]; 
     for (int i = 0; i < n; i++) 
      index[i] = i; 

     int[] aux = new int[n]; 
     sort(a, index, aux, 0, n-1); 
     return index; 
    } 

    { 
     if (hi <= lo) return; 
     int mid = lo + (hi - lo)/2; 
     sort(a, index, aux, lo, mid); 
     sort(a, index, aux, mid + 1, hi); 
     merge(a, index, aux, lo, mid, hi); 
    } 

    // print array to standard output 
    private static void show(Comparable[] a) { 
     for (int i = 0; i < a.length; i++) { 
      StdOut.println(a[i]); 
     } 
    } 

    /** 
    * Reads in a sequence of strings from standard input; mergesorts them; 
    * and prints them to standard output in ascending order. 
    * 
    * @param args the command-line arguments 
    */ 
    public static void main(String[] args) { 
     String[] a = StdIn.readAllStrings(); 
     Merge.sort(a); 
     show(a); 
    } 
} 
+1

不需要转换,'String'实现'Comparable',所以它已经是必需的类型。 – Berger

+3

为了将来的参考,代码示例应该是最小的,即只包含与您的问题相关的代码。因此,如果您对两行代码有疑问,请显示这两行代码,而不是整个程序的来源。如果你在代码之前没有那么整齐地总结你的问题,我不会费心去试图理解这个问题。 – meriton

+0

另外,在stackoverflow上,您可以通过在编辑器中选择它并按下相应的工具栏按钮来格式化代码。这次我为你做了这个。 – meriton

回答

0

是否有某种隐含的对象铸造的适用

铸造是不是你的对象做一些事情,这是你在值做一些(如对象参考)。铸造不会影响对象。但这里没有演员。

撇开原始类型,变量或X类型的放慢参数可以如果被分配Y类型的值类型Y

  • 是对相同类型X,或
  • 是一个class型实施X,或
  • 是一个子接口的X,直接或间接的影响。

类似地,阵列型X[]可分配Y[]类型的值,如果X可根据上述规则被分配Y

String implements Comparable,因此您可以将String分配给Comparable类型的变量或参数。由于阵列类型可根据元素类型进行分配,因此可将String[]分配给Comparable[]类型的变量或参数。

0

这是不特定于函数调用:

Comparable comparable = "hello"; 

String[] strings = {"hello", "world"}; 
Comparable[] comparables = strings; 

Java数组是协变的,这意味着数组分配,如果他们的元素类型。并且String可分配给Comparable,因为String类实现了Comparable接口。