2017-02-08 11 views
2

次のプログラムがあります。エラー:互換性のないタイプ:Uをintに変換できません

import java.util.*; 

public class Solution { 


    public static <U extends Number> double median(List<U> l) { 

     double Q = 0; 

     int n = l.size(); 
     if (n%2 == 0) { 
      Q = ((int)l.get(n/2) + (int)l.get(n/2-1))/(double)2; 
     } else { 
      Q = new Double((int)l.get(n/2)); 
     } 

     return Q; 
    } 

    public static void main(String[] args) { 
     Scanner sc = new Scanner(System.in); 

     int n = sc.nextInt(); 
     List<Integer> l = new ArrayList<>(); 


     for (int i = 0; i < n; i++){ 
      l.add(sc.nextInt()); 
     } 

     Collections.sort(l); 

     double Q1 = 0, Q2 = 0, Q3 = 0; 

     List<Integer> lower = new ArrayList<>(); 
     List<Integer> upper = new ArrayList<>(); 

     if (n%2 == 0) { 
      lower.addAll(l.subList(0, n/2)); 
      upper.addAll(l.subList(n/2, n)); 
     } else { 
      lower.addAll(l.subList(0, n/2)); 
      upper.addAll(l.subList(n/2 + 1, n)); 
     } 

     Q2 = median(l); 
     Q1 = median(lower); 
     Q3 = median(upper); 

     System.out.format("%.0f%n", Q1); 
     System.out.format("%.0f%n", Q2); 
     System.out.format("%.0f%n", Q3); 

     sc.close(); 

    } 
} 

それは罰金コンパイルし、私は日食からそれを実行しようとすると、私のローカルマシン上で実行されますが、私はhackerrankするためにそれを送信したとき、私は次のコンパイルエラーが発生します。

Solution.java:12: error: incompatible types: U cannot be converted to int 
      Q = ((int)l.get(n/2) + (int)l.get(n/2-1))/(double)2; 
         ^
    where U is a type-variable: 
    U extends Number declared in method <U>median(List<U>) 
Solution.java:12: error: incompatible types: U cannot be converted to int 
      Q = ((int)l.get(n/2) + (int)l.get(n/2-1))/(double)2; 
              ^
    where U is a type-variable: 
    U extends Number declared in method <U>median(List<U>) 
Solution.java:14: error: incompatible types: U cannot be converted to int 
      Q = new Double((int)l.get(n/2)); 
            ^
    where U is a type-variable: 
    U extends Number declared in method <U>median(List<U>) 
3 errors 

私は戻ってint型への各リスト要素をキャストする必要があり、なぜ私も理解していない、私はUが数を拡張するので、私は戻ってint型にキャストせずにリストの要素を追加することができるはずと思いました。ジェネリックについて理解していないものがありますか? Q1、Q2、Q3は整数であることが保証されていますが(入力テストケースのためだけですが)、それは問題ではありません。なぜ私のプログラムがコンパイルされていませんか?

+0

まあ 'UはNumber'が伸びるが、リスト'て '' '一覧である可能性があります。しかし、 'List 'や 'List 'などとすることもできます。 'List 'や 'List 'をメソッドに渡すとどうなりますか?なぜジェネリックをここに適用するのですか? –

+0

が強制的に使用されているので、同じ方法を使用して倍精度浮動小数点数、またはBigIntegersのリストの中央値を見つけることはできません。 – Rockstar5645

答えて

0

intValue()メソッドは、Number要素に対してintにキャストする代わりに呼び出すことができます。あなたがそれを使用しているよう

https://docs.oracle.com/javase/8/docs/api/java/lang/Number.html#intValue--

+0

このメソッドを使用して浮動小数点数のリストの中央値を見つけることはできませんか? – Rockstar5645

+0

はい、それは浮動小数点数または複素数のリストでも動作しますが、数値は丸められます。中央値をdoubleとして返す場合は、 'doubleValue()'メソッドを使用するほうが良いので、リストに浮動小数点数が含まれていると精度が落ちません。一方、大きな数値を含むIntegerまたはLongのリストは、それらを倍精度にキャストしてゆきます。 – wkenzow

0

なぜあなたは整数にリスト項目をキャストしている場合、一般的な方法として宣言しますか?

public static double median(List<Integer> l)に変更し、すべてのキャストをintに削除します。

+0

大丈夫です、私はintにキャストしませんが、正しく動作するはずですか?私はダブルスのリストのために、中央値を見つけることができるはずです。浮動小数点数、またはその他のデータ型を使用します。私が(int)キャストを削除すると、コードはコンパイルされません。 Uタイプの要素を追加することはできません。 – Rockstar5645

+0

キャストの代わりにl.get(i).doubleValue()を実行できます。 – chaim

関連する問題