2016-09-14 10 views
1

Я начинаю изучать Generics для Java, и я прочитал несколько руководств, но я немного смущен и не знаю, как объявлен общий метод.Основы декларации общих принципов Java

Когда я использую общий тип, каков правильный порядок определения метода? Я нашел этот образец, когда мне нужно использовать угловые скобки, а когда нет?

public class Box<A> { 

    private A a; 
    ... 

    public void setA(A a) { 
     this.a = a; 
    } 

    public <A> List<A> transform(List<A> in) { 
     return null; 
    } 

    public static <A> A getFirstElement(List<A> list) { 
     return null; 
    } 

    public A getA() { 
     return a; 
    } 

ответ

3

Проблема заключается в том, что ваш код использует один и тот же символ А, но у него есть несколько различных «значений» в разных местах:

public class Box<T> { 

брекетов необходимы, потому что вы говорите здесь : Box использует общий тип, называемый Т.

Usages Т идти без скобок:

private T a; 
public void setA(T a) { 

Но

public <T2> List<T2> transform(List<T2> in) { 

представляет другой параметр типа. Я назвал его T2, чтобы было ясно, что это не так же, как и Т. Идея состоит в том, что сфера T2 - это только, что один из способов transform. Другие методы не знают о T2!

public static <A> A getFirstElement(List<A> list) { 

То же, что и выше - будет «T3» здесь ;-)

EDIT на ваш комментарий: Вы не можете иметь статический метод использовать класс шириной типа T. Это просто невозможно! См. here, почему это так!

EDIT № 2: родовое позволяет писать код, который родовое (как это может иметь дело с различными классов); но все же дал вам время компиляции. Пример:

Box<String> stringBox = new Box<>(); 
Box<Integer> integerBox = new Box<>(); 
integerBox.add("string"); // gives a COMPILER error! 

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

+0

Хорошо, я думаю, я это немного понимаю лучше. Но как мне нужно настроить статический метод, чтобы вернуть класс T класса Box? – Eve

+0

Я обновил свой ответ, чтобы ответить на ваш комментарий. – GhostCat

+0

Спасибо, вам больше всего нравится :) Последний вопрос: в чем преимущество класса, объявленного с помощью универсального типа, могу ли я сделать что-то вроде этого? общественный класс Box() { частный T t; общественный ящик (T t) { this.t = t; } – Eve

0

Если у вас есть требование в вашем методе, в котором вам нужно вернуть тип, это зависит от вашего параметра метода в это время, вы можете написать угловую скобку перед сигнатурой метода, как показано в вашем примере. Короче говоря, в качестве слова предлагается использовать Generic для функции, где же класс или утилиты должны быть использован для нескольких типов объектов

1

Вашего примера показывает две различные концепций: обобщенных классов и общих методы

Это универсального класс введения типа параметр <A>:

public class Box<A> { 

} 

Хотя эти общих методы вводя их собственного параметр типа <A>:

public <A> List<A> transform(List<A> in) { 
    return null; 
} 

public static <A> A getFirstElement(List<A> list) { 
    return null; 
} 

сравнить его с классом, имеющим поле определенного имени и методом, имеющим параметр от этого имени:

public class Box { 
    private String name; 

    publix Box(String name) { 
    } 
}