[英]Java Autoboxing/Unboxing and Generic Type issue
我正在測試有關Java泛型的知識,並且遇到了一個問題。
編碼
return (t%2==0);
在我的IsEven.java中不會編譯,以及
int comparison = t.compareTo(memberT);
在我的GreaterThan.java中
我認為這是我如何設置類的通用類型輸入的錯誤? 任何其他幫助將不勝感激。
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
}
不幸的是,像%
這樣的數字運算符不能作為多態構造使用:操作數的類型需要在編譯時知道,這意味着您不能將其與任意Number
。
自動裝箱/拆箱僅在從特定的原始包裝器類型(例如java.lang.Integer
)變為相應的原始類型(即int
)時適用; 沒有要取消裝箱的Number
原始副本。
您可以做的是使用longValue()
或doubleValue()
提取可以與%
一起使用的long
或double
,或者可以將if / else鏈與instanceof
檢查一起使用。 這不會完全解決您的問題,因為Number
是一種開放類型-存在非原始實現。 ( BigInteger
和BigDecimal
是眾所周知的,但是第三方庫也可以添加自己的Number
實現。)
至於其他有關compareTo()
,如上面的評論所述,您需要T extends Comparable<? super T>
T extends Comparable<? super T>
以確保compareTo()
方法存在。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.