2016-04-11 12 views
1

私はGradleに移行するコードを持っていますが、Eclipse上で実行すると(Gradleは正常に動作しません)、Eclipseプラグインを使用するかtrhoughコマンドラインを実行しようとするとダイヤモンド演算子に問題があります。Eclipse上のGradle、ダイヤモンド演算子は認識されませんか?

たとえば、このクラスの:

import java.util.SortedSet; 

/** 
* Holds inventory of currency, calculates balance, makes change. 
* Immutable. 
*/ 
public final class Bank { 
/** 
* Inventory of currencies for the bank. 
*/ 
private final Inventory<Currency> inventory; 

public Inventory<Currency> getInventory() { 
    return inventory; 
} 

/** 
* Calculate the balance (in cents) of the currently held currencies. 
* 
* @return the current balance (in cents) 
*/ 
public long calculateBalance() { 
    long balance = 0L; 
    for (Currency currency : Currency.values()) { 
     balance += currency.getCents() * inventory.quantity(currency); 
    } 
    return balance; 
} 

/** 
* Create a bank made up of currencies from this bank that add up as close 
* as possible to the change amount requested. Exact change is not 
* guaranteed. It's a good idea to check that the calculated balance is 
* the same as the amount you expect. 
* 
* @param amount the amount of change needed 
* @return a bank of change made from as much currency that could be used 
*/ 
public Bank makeChange(final long amount) { 
    long change = amount; 
    Bank changeBank = new Bank(); 
    final SortedSet<Currency> descending = Currency.descending(); 
    for (Currency largest : descending) { 
     int quantity = inventory.quantity(largest); 
     final long cents = largest.getCents(); 
     while (quantity > 0 && change >= cents) { 
      change = change - cents; 
      quantity = quantity - 1; 
      changeBank = changeBank.deposit(largest); 
     } 
    } 
    return changeBank; 
} 

/** 
* Bank constructor. Fills out a new Bank with 0 amounts for each currency. 
*/ 
public Bank() 
{ 
    this.inventory = new Inventory <> (Currency.values()); 
} 

/** 
* Private Bank constructor. Used for returning new, modified instances. 
* 
* @param inventory the new inventory 
*/ 
private Bank(final Inventory<Currency> inventory) { 
    this.inventory = new Inventory<>(Currency.values()).add(inventory); 
} 

/** 
* Deposit the currencies from the incoming Bank into this Bank. 
* 
* @param bank incoming Bank 
* @return new Bank with this Bank's currencies, incoming Bank's currencies 
*/ 
public Bank deposit(final Bank bank) { 
    if (bank == null) { 
     return this; 
    } 
    return new Bank(inventory.add(bank.getInventory())); 
} 

/** 
* Deposit the currency incoming into this Bank. 
* 
* @param currency incoming currency 
* @return new Bank with this Bank's currencies, incoming currency 
*/ 
public Bank deposit(final Currency currency) { 
    if (currency == null) { 
     return this; 
    } 
    return new Bank(inventory.add(currency)); 
} 

/** 
* Withdraws the currencies from the passed in Bank from this Bank. If 
* there aren't enough of any particular currency, set the quantity to 0. 
* 
* @param bank the Bank of currencies to withdraw 
* @return a Bank with the currencies of the passed Bank withdrawn 
*/ 
public Bank withdraw(final Bank bank) { 
    if (bank == null) { 
     return this; 
    } 
    return new Bank(inventory.subtract(bank.getInventory())); 
} 

}

私はタイプエラーのillegatスタートを切る:

illegal start of type this.inventory <> (Currency.values()); 
            ^

私はダイヤモンドのオペレータはJDK7から使用することができることを知っていますジェネリックの型推論をするために、私はなぜこのエラーが出るのか困惑しています。私はそれを修正するために私を助けることができますか?あなたが使用するためのJavaのバージョンを指定しない限り、事前

+0

あなたが投稿したコードでthis.inventoryあります? –

答えて

2

おかげで、Gradleのは、現在使用中のJVMのバージョンを使用してコードをコンパイルします。ダイヤモンド演算子に関するエラーメッセージが表示されている場合は、コマンドラインで使用しているJavaのバージョンが1.7より古いことを意味します。それ以降のバージョンにアップグレードする必要があります(または、複数のバージョンがインストールされている場合は、別のバージョンをアクティブにします)。

それは明示的にbuild.gradleファイルに以下の行を追加することで、バージョンを指定するには、ほとんど常に良い考えです:

sourceCompatibility = 1.7 
targetCompatibility = 1.7 

参考:https://docs.gradle.org/current/userguide/java_plugin.html

関連する問題