Простое решение с использованием регулярного выражения, в котором я проверяю, окружено ли только слово пробелом или в начале строки с пробелом после, или в конце строки с пробелом перед.
String regex = "( WORD )|(^WORD )|( WORD$)";
Pattern p = Pattern.compile(regex);
Matcher m = p.matcher(test1);
if (m.find()) {
System.out.println("[" + m.group(0).trim() + "]");
}
Если я понимаю Вас правильно, необходимо, вероятно, объявить:
public class ZoneList<T extends Card> {
protected List<T> cardBox;
}
public class PokerHand extends ZoneList<PokerCard> {
public PokerHand() {
cardBox = new ArrayList<PokerCard>();
}
}
Marc и kolstae дали хорошие ответы с точки зрения того, как обойти проблему, но я думаю, что стоит объяснить, почему Ваш исходный код не работает.
Кроме того я склонен помещать проблему с точки зрения фруктов. Предположим, что мы имеем:
List<Banana> bananaBunch = new ArrayList<Banana>();
List<Fruit> fruitBowl = bananBunch;
fruitBowl.add(new Apple());
Если это позволяется, мы заканчиваем с яблоком в наборе бананов, который является, очевидно, плохой вещью. Так, где проблема? Первая строка должна быть хорошо, и третья строка должна быть хорошо - можно добавить любой вид фруктов к List<Fruit>
- таким образом, проблема должна быть во второй строке. Это - то, что запрещается, точно для предотвращения этого вида проблемы.
Это помогает вообще?
Как указано, Вы не можете бросить ArrayList<PokerCard>
кому: ArrayList<Card>
, но можно бросить ArrayList<PokerCard>
кому: ArrayList<? extends Card>
. Или лучшее использование List<? extends Card>
как Ваше возвращаемое значение, потому что Вы, вероятно, не полагаетесь на реализацию ArrayList так или иначе:
protected ArrayList<? extends Card> getCardBox();
Что касается Вашего вопроса в комментарии, должна работать конструкция, как Вы описали: List<? extends Card> list = new ArrayList<Card>();
. Вероятно, необходимо заполнить список, таким образом, метод - вероятно, что-то вроде этого:
protected ArrayList<? extends Card> getCardBox() {
List<Card> list = new ArrayList<Card>();
list.add(pokerCard1);
list.add(pokerCard2);
return java.util.Collections.unmodifiableList(list);
}
В первую очередь, это - обычно лучшая практика для использования метода считывания/методов установщика, чем доступ к свойствам непосредственно, особенно если Вы собираетесь быть выполнением большого сложного наследования.
Что касается проблемы дженериков, Вы могли попытаться определить cardBox метод считывания в суперклассе (или интерфейс/абстрактный класс верхнего уровня) как:
protected ArrayList<? extends Card> getCardBox();
Тем путем Вы можете ovverride это в подклассах и сделать, чтобы они возвратили список любого типа подкласса Карты.
Это собирается зависеть от того, в чем управление доступом находится на Arraylist Zonelist
. Мое предположение от оператора отладчика - то, что это является или неотмеченным, общедоступным, или защищенное. Подкласс может "Скрыть" переменную родительского класса, к которой он имеет доступ путем определения переменной с тем же именем. Можно также использовать this
ключевое слово для обращения к конкретному экземпляру объекта и super
ключевое слово для обращения к родителю.
Вот хорошая ссылка на основное управление доступом в Java:
http://java.sun.com/docs/books/tutorial/java/javaOO/accesscontrol.html
Это Вы могли бы также найти полезным