Шаблоны в Java

Помечено: 

Просмотр 0 веток ответов
  • Автор
    Сообщения
    • #6481
      @admin

      Шаблон класса

      Параметры шаблона класса указываются в угловых скобках. Класс не может быть потомком класса Throwable. Если в С++ по шаблону класса создается именно новый класс, то в Java типы, созданные по одному шаблону, являются классом этого шаблона. Поэтому тип параметра нельзя использовать для определения статических членов или использовать в статических методах.

      public class TstTpl<T> {
      	private T t;
      
      	public TstTpl(T tt) {
      		t = tt;
      	}
      
      	public void out() {
      		System.out.println("tplclass="+getClass()+
      		", param class=" + t.getClass() + ", val=" 
      				+ t.toString());
      	}
      
      	public static void main(String[] args) {
      		new TstTpl<Boolean>(true).out();
      
      		// сгенерированные типы принадлежат одному классу
      		TstTpl<Integer> a = new TstTpl<Integer>(1);
      		TstTpl<Double> b = new TstTpl<Double>(3.14);
      		System.out.println(a.getClass() == b.getClass());
      	}
      }

      шаблон метода

      Аналогичным образом в классе можно определить шаблонный метод.

      public class TstTplm {
      
      	static <T1, T2> void outmerge(T1 t1, T2 t2) {
      		System.out.println(t1.toString() + t2);
      	}
      
      	public static void main(String[] args) {
      		outmerge(new Double(3.14),new Boolean(true));
      	}	
      }

      знак вопроса

      В определении шаблона или при генерации можно использовать знак вопроса.

      • ? — указывает на любой класс. классы, но сама специфика класса для них не важна;
      • ? extends T — определяет множество классов потомков от T;
      • ? super T — определяет множество родительских классов класса T.

      Например, если нам нужен метод вывода списка фигур, потомков абстрактного класса Shape, то определение метода будет выглядеть следующим образом.

      public void draw(List<? extends Shape> shape) {
         //... 
      }

Просмотр 0 веток ответов
  • Для ответа в этой теме необходимо авторизоваться.
×