2016-12-04 13 views
0

任意のタイプの配列をソートするための汎用クラスを作成しようとしました。
最初の並べ替え関数は、任意の種類の配列の並べ替えを行います。 うまく動作します。ジェネリックリストをJavaの汎用配列に変換する方法は?

2番目のソート関数では、リストを渡して、最初のソート関数を使用するように配列に変換しようとしました。 しかし、リストを汎用クラス内の配列に変換しようとすると、予期しない型のエラーがスローされます。

import java.util.Arrays; 
import java.util.Collections; 
import java.util.List; 

    public class Sort<T extends Comparable>{ 
     //public T l; 
     T tmp; 
     public void sort(T[] l){ 

     for(int i=0;i<l.length;i++){ 
      for(int j=i+1;j<l.length;j++){ 
       if(l[i].compareTo(l[j])>0){ 
        tmp=l[i]; 
        l[i]=l[j]; 
        l[j]=tmp; 
       } 
      } 
     } 
        System.out.println(Arrays.asList(l)); 
       } 
     public <T extends Comparable> void sort(List<T> l){ 
      T[] array = (T[]) new Object[l.size()]; 
      sort(l.toArray(T[] array)); 
     // System.out.println(l); 
     } 

    public static void main(String[] args){ 
       Integer[] i={2,4,1,5,3}; 
       List<String> l = Arrays.asList("c","d","a","e","b"); 
       Sort s=new Sort(); 
       //String[] j=l.toArray(new String[l.size()]); 
       s.sort(i); 
       s.sort(l); 

      } 
    } 

答えて

1

、あなたがそれらの間に一貫性を持たせたい場合は、クラスやメソッドの同じパラメータ化された型を使用する必要があります。
別の質問があります。そうしないと、予期しない結果が生じる可能性があるので、オレンジとバナナを混ぜてはいけません。 、配列にリストを変換し、あなたの方法では、ほかに

StringBooleanCustomClassWhichIsComparable:あなたは、配列やリストのそれらの間で比較するように設計されていない同等のオブジェクトのミックスを入れ、仮定Comparableの配列にObjectの配列を割り当てたいとします。しかし、すべてのObjectインスタンスが必ずしもComparableインスタンスではないため、実行できません。

public <T extends Comparable> void sort(List<T> l){ 
    T[] array = (T[]) new Object[l.size()]; 
    sort(l.toArray(T[] array)); 
} 


あなたはそれを行うことができます:どちらの場合も

public void sort(List<T> l) { 
    T[] array = (T[]) new Comparable[l.size()]; 
    sort(l.toArray(array)); 
} 

は、警告が、例外なくを持っているでしょう。ここ

は、提案された修正を加えたクラスである:

public class Sort<T extends Comparable<T>> { 

    T tmp; 


    public void sort(T[] l) { 

    for (int i = 0; i < l.length; i++) { 
     for (int j = i + 1; j < l.length; j++) { 
      if (l[i].compareTo(l[j]) > 0) { 
      tmp = l[i]; 
      l[i] = l[j]; 
      l[j] = tmp; 
      } 
     } 
    } 
     System.out.println(Arrays.asList(l)); 
    } 

    public void sort(List<T> l) { 
     T[] array = (T[]) new Comparable[l.size()]; 
     sort(l.toArray(array)); 
    } 

    public static void main(String[] args) { 
     Integer[] i = { 2, 4, 1, 5, 3 }; 
     Sort<Integer> sortInt = new Sort<Integer>(); 
     sortInt.sort(i); 

     Sort<String> sortString = new Sort<String>(); 
     List<String> l = Arrays.asList("c", "d", "a", "e", "b"); 
     sortString.sort(l); 
    } 
} 
0

問題は、2番目のsort方法で<T extends Comparable>です。このタイプTです。あなたのクラスタイプTをシャドウイングです。

名前を変更することはできますが、最初の方法で何かを返さないので、最も簡単な修正は、コンパイラが再び満足できるように、そのまま放置することです。このようなものに変換することを、あなたのコードで始まる:あなたはそれはあなたが整数arrrayでそれを使用することができる文句を言わないこと(例えばSort(<)String(>) s = new Sort<>())クラスレベル上の任意の汎用引数を意味するものではありdidntのため

public void sort(List<T> l){ 
    T[] array = (T[]) new Object[l.size()]; 
    sort(array); 
} 
1

その(と逆の場合は汎用タイプとしてIntegerを使用しています)。私がやることは、メソッドレベルで汎用引数を代わりに使用することです。 (あなたは第二の方法で行ったように)n247sが示唆したように

public class Sort { 

    public <T extends Comparable> void sort(T[] l){ 
    T tmp; 
    for(int i=0;i<l.length;i++){ 
     for(int j=i+1;j<l.length;j++){ 
      if(l[i].compareTo(l[j])>0){ 
       tmp=l[i]; 
       l[i]=l[j]; 
       l[j]=tmp; 
      } 
     } 
    } 
       System.out.println(Arrays.asList(l)); 
      } 
    public <T extends Comparable> void sort(List<T> l){ 
     T[] array = (T[]) new Object[l.size()]; 
     sort(l.toArray(T[] array)); 
    // System.out.println(l); 
    } 
関連する問題