>  기사  >  Java  >  Java의 제네릭 예제에 대한 자세한 설명

Java의 제네릭 예제에 대한 자세한 설명

零下一度
零下一度원래의
2017-06-30 10:10:591231검색

1. 정의

일반이란 유형을 매개변수화하는 기능을 말합니다. 일반 유형으로 클래스나 메서드를 정의하면 컴파일러는 이를 구체적인 유형(일반 인스턴스화)으로 바꿉니다. 제네릭 사용의 주요 이점은 런타임이 아닌 컴파일 타임에 오류를 감지할 수 있다는 것입니다. 보안을 강화하기 위해 jdk1.5 이후에 등장한 기능입니다. 내 이해는 그것이 특별한 사양에 가깝다는 것입니다. 예를 들어 프로그래머가 이를 호출하거나 클라이언트가 이를 도입할 때 그들은 좋은 것과 좋은 것을 혼합할 수 없습니다. ! 이전 정의에서는 String 유형을 입력하면 여기에 불순종하면 실행을 계속할 필요가 없으며 직접 사망하게 된다고 했습니다.

2. 결정되지 않은 제네릭의 단점

1. 경고, 제네릭 매개변수화 없음

2. 제네릭을 정의하지 않으면 모든 유형의 객체를 컬렉션에 로드할 수 있으므로 안전하지 않습니다.

3.

import java.util.Iterator;import java.util.Set;import java.util.TreeSet;public class Test {public static void main(String[] args) {
        Set treeSet = new TreeSet();//没有使用泛型,应该这样:Set<Student> treeSet = new TreeSet<Student>();treeSet.add(new Student(11, 80, "李平"));
        treeSet.add(new Student(23, 40, "王芳"));
        treeSet.add(new Student(10, 60, "赵磊"));
        treeSet.add(new Student(12, 40, "王小二"));
        treeSet.add(new Student(10, 60, "马苗"));
        treeSet.add(new Student(18, 60, "马苗"));
        treeSet.add(new Student(25, 70, "姜浩"));

        Iterator it = treeSet.iterator();while (it.hasNext()) {
            Student stu = (Student) it.next();//没有使用泛型:需要强转            System.out.println(stu);
        }

    }
}

컴파일 시 오류 보고 시작(노란색):

수정 후:

참고: 일반 유형은 참고형! ! !

참고: 일반 유형은 참조 유형이어야 합니다! ! !

참고: 일반 유형은 참조 유형이어야 합니다! ! !

3. 일반 공식화

JDK에서는 다음 세 가지 상황을 자주 볼 수 있습니다.

1.TreeSet(Collection c)

2.TreeSet( Comparator 비교기)

3.TreeSet(SortedSet s)

그 중

? 와일드카드는 모든 데이터 유형을 의미합니다.

< (보시다시피 3은 제네릭의 일반적인 정의입니다.)

아래 참고:

제네릭의 상한: // E 유형 또는 E
Generics의 하위 유형을 수신함을 나타냅니다. 하한: // E 유형 또는 E의 상위 유형을 수신함을 나타냅니다.

코드 예:

//这时这个函数只能接收 Number及其子类static void show(Point<? extends Number> p){ 
        System.out.println(p.getX());
        System.out.println(p.getY());
    }    public static void main(String[] args) {/* 对于上面的声明,下面的操作是可以的
        Point<Integer> p1=new Point<Integer>();
        p1.setX(new Integer(90));
        p1.setY(new Integer(50));
        show(p1);      *///下面的操作将出错Point<String> p1=new Point<String>();
        p1.setX("90ok");
        p1.setY("50ok");
        show(p1); //出错
  show(Point<?  String>  <String> p1= Point<String>"90ok""50ok"

(인터넷 사진)

IV. 제네릭 적용 이해

제네릭 클래스, 제네릭 메서드 및 제네릭 인터페이스를 사용자 정의할 수 있습니다. 배울 때 그 원리를 알아야 하고 앞으로는 JDK에서 즐겁게 호출할 수 있습니다~~

1. Custom generic class

class ObjectFactory<T> { // 声明泛型為<T>private T obj;public T getObj() {return this.obj;
    }public void setObj(T obj) {this.obj = obj;
    }/* * 下面的写法不成立 public T getNewObj(){ T t=new T(); //在编译期,无法确定泛型的参数化的类型 return
     * t; }     */}class Test4 {public static void main(String[] args) {// List list=new ArrayList();/* * ObjectFactory f=new ObjectFactory(); f.SetObj("ss");         */ObjectFactory<String> f = new ObjectFactory<String>();
        f.setObj("这里必须是String");// f.SetObj(89); 不可以String obj = f.getObj();
        System.out.println(obj);

        ObjectFactory<Student> stuList = new ObjectFactory<Student>();

        stuList.setObj(new Student(67, 90, "张三"));
        stuList.getObj().speak();
    }
}

2. Generic method

public class TestFan {    // 泛型方法,这里不做限制,传什么都可以public <T> void show(T t) {
        System.out.println("这是泛型方法中的" + t);
    }
}class Test5 {public static void main(String[] args) {
        TestFan tfan = new TestFan();
        
        tfan.show("777");
        
        tfan.show(898);
        
        tfan.show(new Student(30, 20, "猫"));
    }
}

3. 일반 인터페이스

5. 일반 제한 사항

1. 즉, new E()

2를 사용할 수 없습니다.

3. 클래스의 매개변수는 정적 환경에서 제네릭 유형이 될 수 없습니다. (참고)

제네릭 클래스의 모든 인스턴스는 동일한 런타임 클래스를 가지므로 제네릭 클래스의 정적 변수와 메서드는 다음에 의해 제어됩니다. 모든 인스턴스에서 공유됩니다. 공유되므로 동일한 제네릭 유형을 다시 정의할 필요가 없습니다. 동일한 제네릭 유형을 정의하지 않고 공유(또는 일관성)를 달성할 수 없는 경우 이 상황을 통과할 필요가 없습니다. 따라서 정적 환경에서 클래스 매개변수를 제네릭으로 설정하는 것은 불법입니다.

rreee

위 내용은 Java의 제네릭 예제에 대한 자세한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.