Кастинг между ArrayLists в Java

Простое решение с использованием регулярного выражения, в котором я проверяю, окружено ли только слово пробелом или в начале строки с пробелом после, или в конце строки с пробелом перед.

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() + "]");
}
8
задан Ziggy 11 December 2008 в 06:55
поделиться

5 ответов

Если я понимаю Вас правильно, необходимо, вероятно, объявить:

public class ZoneList<T extends Card> {
   protected List<T> cardBox;
}

public class PokerHand extends ZoneList<PokerCard> {
   public PokerHand() {
      cardBox = new ArrayList<PokerCard>();
   }
}
12
ответ дан 5 December 2019 в 04:31
поделиться

Marc и kolstae дали хорошие ответы с точки зрения того, как обойти проблему, но я думаю, что стоит объяснить, почему Ваш исходный код не работает.

Кроме того я склонен помещать проблему с точки зрения фруктов. Предположим, что мы имеем:

List<Banana> bananaBunch = new ArrayList<Banana>();
List<Fruit> fruitBowl = bananBunch;
fruitBowl.add(new Apple());

Если это позволяется, мы заканчиваем с яблоком в наборе бананов, который является, очевидно, плохой вещью. Так, где проблема? Первая строка должна быть хорошо, и третья строка должна быть хорошо - можно добавить любой вид фруктов к List<Fruit> - таким образом, проблема должна быть во второй строке. Это - то, что запрещается, точно для предотвращения этого вида проблемы.

Это помогает вообще?

19
ответ дан 5 December 2019 в 04:31
поделиться

Как указано, Вы не можете бросить 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);
}
6
ответ дан 5 December 2019 в 04:31
поделиться

В первую очередь, это - обычно лучшая практика для использования метода считывания/методов установщика, чем доступ к свойствам непосредственно, особенно если Вы собираетесь быть выполнением большого сложного наследования.

Что касается проблемы дженериков, Вы могли попытаться определить cardBox метод считывания в суперклассе (или интерфейс/абстрактный класс верхнего уровня) как:

protected ArrayList<? extends Card> getCardBox();

Тем путем Вы можете ovverride это в подклассах и сделать, чтобы они возвратили список любого типа подкласса Карты.

10
ответ дан 5 December 2019 в 04:31
поделиться

Это собирается зависеть от того, в чем управление доступом находится на Arraylist Zonelist. Мое предположение от оператора отладчика - то, что это является или неотмеченным, общедоступным, или защищенное. Подкласс может "Скрыть" переменную родительского класса, к которой он имеет доступ путем определения переменной с тем же именем. Можно также использовать this ключевое слово для обращения к конкретному экземпляру объекта и super ключевое слово для обращения к родителю.

Вот хорошая ссылка на основное управление доступом в Java:

http://java.sun.com/docs/books/tutorial/java/javaOO/accesscontrol.html

Это Вы могли бы также найти полезным

http://java.sys-con.com/node/46344

1
ответ дан 5 December 2019 в 04:31
поделиться
Другие вопросы по тегам:

Похожие вопросы: