2016-12-11 70 views
0

私はジェネリックスに関する知識をJavaでテストしています。私のIsEven.javaでJava Autoboxing/UnboxingとGeneric Typeの問題

コード

return (t%2==0); 

文句を言わない私は、これは私がどのように設定すると、エラーであると仮定し、コンパイルだけでなく、私のGreaterThan.java

int comparison = t.compareTo(memberT); 

クラスの一般的なタイピングをアップする?追加の助けをいただければ幸いです。

ArrayTester.java

import java.util.Arrays; 


public class ArrayTester<T> { 

    private T[] myArray; 
    CustomTest<T> tester; 

    public ArrayTester(T[] tArray, CustomTest<T> cTest) 
    { 
     myArray = tArray.clone(); 
     tester = cTest; 
     Arrays.sort(myArray); 
    } 

    public void printIfValid() 
    { 
     for(int i = 0; i < myArray.length; i++) 
     { 
      if(tester.test(myArray[i])) 
      { 
       System.out.print(myArray[i] + " "); 
      } 
     } 
     System.out.println(); 
    } 

    public int countIfValid() 
    { 
     int tracker = 0; 

     for(int i = 0; i < myArray.length; i++) 
     { 
      if(tester.test(myArray[i])) 
      { 
       tracker++; 
      } 
     } 
     return tracker; 
    } 

} 

CustomTest.java

public interface CustomTest<T> { 
    public boolean test(T t); 
} 

AllLower.java

public class AllLower implements CustomTest<String> { 

    public boolean test(String t) { 
     String lowerCaseVersion = t.toLowerCase(); 
     return t.equals(lowerCaseVersion); 
    }  
} 

GreaterThan.java

public class GreaterThan<T extends Object> implements CustomTest<T> { 

    T memberT; 

    @Override 
    public boolean test(T t) { 
     int comparison = t.compareTo(memberT); //why doesnt this work? 
     if(comparison == 1) 
     { 
      return true; 
     }else{ 
      return false; 
     } 
    } 

    public GreaterThan(T t) 
    { 
     memberT = t; 
    } 

} 

ECTester.java

public class ECTester { 

     public static void main(String[] args) { 
       Integer[] intArray = {2, 8, 6, 7, 4, 10, 3, 1, 9, 5}; 
       Double[] dblArray = {11.9, 12.2, 5.4, 0.2, 3.3, 3.9, 4.2, 1.1, 123456.0, 10.0001}; 
       String[] strArray = {"Why", "is", "A", "raven", "liKe", "a", "wriTing", "desk?"}; 

       ArrayTester<Integer> intTest = new ArrayTester<Integer>(intArray, new IsEven<Integer>()); 
       ArrayTester<Double> dblTest = new ArrayTester<Double>(dblArray, new IsEven<Double>()); 
       ArrayTester<String> strTest = new ArrayTester<String>(strArray, new AllLower()); 
       ArrayTester<Integer> intCompare = new ArrayTester<Integer>(intArray, new GreaterThan<Integer>(4)); 
       ArrayTester<Double> dblCompare = new ArrayTester<Double>(dblArray, new GreaterThan<Double>(4.5)); 
       ArrayTester<String> strCompare = new ArrayTester<String>(strArray, new GreaterThan<String>("last")); 

       System.out.println("There are " + intTest.countIfValid() + " valid integers"); 
       System.out.println("They are: "); 
       intTest.printIfValid(); 

       System.out.println(); 

       System.out.println("There are " + dblTest.countIfValid() + " valid doubles"); 
       System.out.println("They are: "); 
       dblTest.printIfValid(); 

       System.out.println(); 

       System.out.println("There are " + strTest.countIfValid() + " valid strings"); 
       System.out.println("They are: "); 
       strTest.printIfValid(); 

       System.out.println(); 

       System.out.println("There are " + intCompare.countIfValid() + " integers greater than 4"); 
       System.out.println("They are: "); 
       intCompare.printIfValid(); 

       System.out.println(); 

       System.out.println("There are " + dblCompare.countIfValid() + " doubles greater than 4.5"); 
       System.out.println("They are: "); 
       dblCompare.printIfValid(); 

       System.out.println(); 

       System.out.println("There are " + strCompare.countIfValid() + " strings greater than \"last\""); 
       System.out.println("They are: "); 
       strCompare.printIfValid(); 

       System.out.println(); 


     } 
} 

IsEven.java

public class IsEven<T extends Number> implements CustomTest<T>{ 

    @Override 
    public boolean test(T t) { 
     return (t%2==0); 
    } 
    //Can't figure out why it wont accept this 
} 
+4

'%'はオブジェクトで使用できません。また、 'Number'はオブジェクトです。また、 'Object'には' compareTo'メソッドがありません。 'T extends Comparable ' –

+0

2番目の部分は私のエラーを修正しました。私は間違いなくすべてのオブジェクトにcompareToメソッドがあると仮定しました。しかし、私はまだNumberの状況について何をすべきか理解していません。私はautoboxing/unboxingの全体的なポイントは、自動的に元の型に変換することだと思った? –

+1

これは 'Integer'、' Long'、 'Short'のようなそれらの型のボックス版で動作します。 'Number'はそれらの型の一つではありません。 –

答えて

0

残念ながら%のような数値演算子は、多型構築物として使用できません。オペラの種類ndsはコンパイル時に知る必要があります。つまり、任意のNumberで使用することはできません。

autoboxing/unboxingは、特定のプリミティブラッパータイプ(たとえばjava.lang.Integer)から対応するプリミティブタイプ(つまりint)に移行する場合にのみ適用されます。 unboxへのNumberのプリミティブの対応はありません。あなたは何ができるか

はあなた%を使用し、または可能性instanceofチェックしている場合/他のチェーンを使用することができますlongまたはdoubleを引き出すためにlongValue()doubleValue()を使用するかです。 Numberはオープ​​ンタイプなので、これは完全にあなたの問題を解決することはできません。非プリミティブな実装が存在します。 (BigIntegerBigDecimalはよく知られているものですが、サードパーティのライブラリも同様に、自分のNumber実装を追加することができます。)あなたの他の質問についてcompareTo()については

、上記のコメントで述べたように、あなたが確認するためにT extends Comparable<? super T>が必要compareTo()メソッドが存在することを確認します。