>Java >java지도 시간 >Java의 제네릭이란 무엇입니까? Java 제네릭에 대한 자세한 소개

Java의 제네릭이란 무엇입니까? Java 제네릭에 대한 자세한 소개

不言
不言앞으로
2018-10-19 16:28:533709검색

이 기사의 내용은 Java의 제네릭이 무엇인지에 관한 것입니다. Java 제네릭에 대한 자세한 소개는 특정 참고 가치가 있습니다. 도움이 필요한 친구가 참고할 수 있기를 바랍니다.

1. 제네릭이란 무엇입니까?
Java 제네릭 설계 원칙: 컴파일 중에 경고가 없으면 런타임 중에 ClassCastException 예외가 발생하지 않습니다.

Generics: 객체를 생성하거나 메서드를 호출할 때까지 유형 설명 작업을 연기합니다. 특수 유형

매개변수화된 유형: ArrayList

Integer를 실제 유형 매개변수라고 합니다.

전체를 ArrayList

전체 ArrayList를 매개변수화된 유형이라고 합니다

2. 제네릭이 필요한 이유는 무엇인가요?

제네릭 사용 시:

코드가 더 간결해졌습니다. [강제 변환 없음]
  • 프로그램이 더 강력해졌습니다. [컴파일 시 경고가 없으면 런타임 시 ClassCastException이 발생하지 않습니다.]
  • 가독성 및 안정성 [컬렉션 작성 시 유형이 제한됩니다.]
  • 컬렉션을 생성할 때 우리는 컬렉션이 명확해졌으므로 Enhanced for를 사용하여 컬렉션을 탐색할 수 있습니다!
//创建集合对象
ArrayList<String> list = new ArrayList<>();
list.add("hello");
list.add("world");
list.add("java");

//遍历,由于明确了类型.我们可以增强for
for (String s : list) {
    System.out.println(s);
}
3. 제네릭 기본

제네릭 클래스는 클래스에 제네릭 유형을 정의하는 것입니다. 사용자가 클래스를 사용할 때 유형이 명확해집니다. 이 경우 사용자는 클래스가 어떤 유형을 나타내는지 지정합니다. .. 사용자는 사용시 강제 전송이나 런타임 변환 예외에 대해 걱정할 필요가 없습니다.

클래스에 정의된 제네릭은 클래스 메서드에서도 사용할 수 있습니다!

/*
    1:把泛型定义在类上
    2:类型变量定义在类上,方法中也可以使用
 */
    public class ObjectTool<T> {
        private T obj;
    
        public T getObj() {
            return obj;
        }
    
        public void setObj(T obj) {
            this.obj = obj;
        }
    }
사용자가 어떤 유형을 사용하고 싶은지, 생성 시 유형을 지정하면 됩니다. 사용하면 클래스가 사용자가 사용하려는 유형으로 자동 변환됩니다.

public static void main(String[] args) {

//创建对象并指定元素类型
ObjectTool<String> tool = new ObjectTool<>();

tool.setObj(new String("钟福成"));
String s = tool.getObj();
System.out.println(s);


//创建对象并指定元素类型
ObjectTool<Integer> objectTool = new ObjectTool<>();
/**
 * 如果我在这个对象里传入的是String类型的,它在编译时期就通过不了了.
 */
objectTool.setObj(10);
int i = objectTool.getObj();
System.out.println(i);
}

제네릭 메서드 정의... 제네릭이 먼저 정의된 다음 사용됩니다

//定义泛型方法..
public <T> void show(T t) {
    System.out.println(t);
}
사용자가 전달하는 유형, 반환 값은 어떤 유형이 됩니다

public static void main(String[] args) {
    //创建对象
    ObjectTool tool = new ObjectTool();

    //调用方法,传入的参数是什么类型,返回值就是什么类型
    tool.show("hello");
    tool.show(12);
    tool.show(12.5);

}
서브클래스는 제네릭 클래스의 타입 매개변수 변수를 명시합니다

/*
    把泛型定义在接口上
 */
public interface Inter<T> {
    public abstract void show(T t);
}
제네릭 인터페이스를 구현하는 클래스...

/**
 * 子类明确泛型类的类型参数变量:
 */

public class InterImpl implements Inter<String> {
    @Override
    public void show(String s) {
        System.out.println(s);
    }
}
IV. 제네릭의 적용

웹 페이지를 작성할 때 여러 DAO가 있는 경우가 많습니다. 매번 여러 개의 DAO를 작성하는 것은 약간 번거롭습니다.

public abstract class BaseDao<T> {

    //模拟hibernate....
    private Session session;
    private Class clazz;


    //哪个子类调的这个方法,得到的class就是子类处理的类型(非常重要)
    public BaseDao(){
        Class clazz = this.getClass();  //拿到的是子类
        ParameterizedType  pt = (ParameterizedType) clazz.getGenericSuperclass();  //BaseDao<Category>
        clazz = (Class) pt.getActualTypeArguments()[0];
        System.out.println(clazz);

    }


    public void add(T t){
        session.save(t);
    }

    public T find(String id){
        return (T) session.get(clazz, id);
    }

    public void update(T t){
        session.update(t);
    }

    public void delete(String id){
        T t = (T) session.get(clazz, id);
        session.delete(t);
    }

}

추상 DAO를 상속하며 구현 클래스에는 추가, 삭제, 수정 및 확인에 해당하는 메서드가 있습니다.
rreee

위 내용은 Java의 제네릭이란 무엇입니까? Java 제네릭에 대한 자세한 소개의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 segmentfault.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제