ジェネリックを学ぶことを試みています。Card
とDeck
のようなものです。Tに互換性のない境界があります - Javaジェネリック
Card.java
package com.tn.deck;
public class Card<S extends Comparable<S>, R extends Comparable<R>> implements Comparable<Card<S, R>> {
private S suit;
private R rank;
public Card(S suit, R rank) {
this.suit = suit;
this.rank = rank;
}
@Override
public String toString() {
return "Card{" +
"suit=" + suit +
", rank=" + rank +
'}';
}
@Override
public int compareTo(Card<S, R> o) {
return rank.compareTo(o.rank);
}
}
Deck.java
package com.tn.deck;
import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.IntStream;
public final class Deck<T extends Card> {
private List<T> deck;
public <S extends Comparable<S>, R extends Comparable<R>> Deck(int numberOfDecks, S[] suits, R[] ranks) {
this.deck = initializeDecks(numberOfDecks, suits, ranks);
shuffle();
}
private <S extends Comparable<S>, R extends Comparable<R>> List<T> initializeDecks(S[] suits, R[] ranks) {
return Arrays.stream(suits)
.flatMap(suit -> Arrays.stream(ranks).map(rank -> new Card<>(suit, rank)))
.collect(Collectors.toList()); // === It complains here. ===
}
private <S extends Comparable<S>, R extends Comparable<R>> List<T> initializeDecks(int numberOfDecks, S[] suits, R[] ranks) {
return IntStream.range(0, numberOfDecks)
.mapToObj(i -> initializeDecks(suits, ranks))
.flatMap(Collection::stream)
.collect(Collectors.toList());
}
public void shuffle() {
Collections.shuffle(deck);
}
@Override
public String toString() {
return "Deck{" +
"deck=" + deck +
'}';
}
}
私が手にエラーがそれはおそらく私だけがジェネリックを理解していない
Error:(57, 25) java: incompatible types: inference variable T has incompatible bounds
equality constraints: T
lower bounds: com.tn.deck.Card<S,R>
ですが、私本当に私が間違っていることを誰かに説明してください。
価値があるのは、どちらのクラスも実際にジェネリックを使用するべきではないということです。 – GriffeyDog
@GriffeyDogこれは主に学習目的のためです。 –
複数のスーツタイプと複数のランクタイプがありますか?具体的な 'Card
'タイプの 'S'と' R'の代わりに使える、あなたが書いた、または使用しようとしているタイプは?ジェネリックスは、命令ではなく型に関するアサーションです。あなたのタイプアサーションは 'Card'または 'Card 'を許します。どうやってそれらを扱いますか? –