Java java지도 시간 Java 제네릭에서 자리 표시자 T와 의 차이점은 무엇입니까?

Java 제네릭에서 자리 표시자 T와 의 차이점은 무엇입니까?

May 11, 2023 pm 06:10 PM
java

첫 번째 두 가지 코드:

public static <T> void show1(List<T> list){
 for (Object object : list) {
        System.out.println(object.toString());
    }
}

public static void show2(List<?> list) {
    for (Object object : list) {
        System.out.println(object);
    }
}
로그인 후 복사

show1 메소드에서 T를 사용하는 것을 볼 수 있습니다. 이것이 제네릭을 작성하는 일반적인 방법이라는 것을 누구나 알고 있으므로 여기서 T는 특정 유형의 특정 객체를 나타냅니다. 동일한 유형의 데이터를 저장할 수 있습니다. 다른 유형의 데이터가 삽입되면 오류가 보고됩니다.

그럼 show2 메소드에서는 무엇을 사용하나요? , void? 앞에 <T>가 없는 것을 볼 수 있습니다. 자리 표시자로 표현될 수 있으며 목록 모음에 얼마나 많은 유형의 데이터가 저장될지 알 수 없으므로 목록에 N개의 데이터 유형을 저장할 수도 있음을 보여줍니다. <T>,?可以表示成占位符,它自己也不知道list集合中会存放多少种类型的数据,所以这样就表明我们的list中存放N种数据类型也是可以的。

我们通过一段测试代码来直观的感受一下二者的区别吧:

public static void test(){
   List<Student> list1 = new ArrayList<>();
   list1.add(new Student("zhangsan",18,0));
   list1.add(new Student("lisi",28,0));
   list1.add(new Student("wangwu",24,1));
   //这里如果add(new Teacher(...));就会报错,因为我们已经给List指定了数据类型为Student
   show1(list1);

   System.out.println("************分割线**************");

   //这里我们并没有给List指定具体的数据类型,可以存放多种类型数据
   List list2 = new ArrayList<>();
   list2.add(new Student("zhaoliu",22,1));
   list2.add(new Teacher("sunba",30,0));
   show2(list2);
}
로그인 후 복사

来看看运行结果:

Student{name='zhangsan', age=18, sex=0}
Student{name='lisi', age=28, sex=0}
Student{name='wangwu', age=24, sex=1}
************分割线**************
Student{name='zhaoliu', age=22, sex=1}
Teacher{name='sunba', age=30, sex=0}

从show2方法可以看出和show1的区别了,list2存放了Student和Teacher两种类型,同样可以输出数据,所以这就是T和?的区别啦~小伙伴们了解了吧

下面来看看?的扩展写法:

List<? extends 数据类型> list

public static void show3(List<? extends Teacher> list) {
    for (Object object : list) {
        System.out.println(object);
    }
}
로그인 후 복사

List<? extends Teacher> list这种写法表示可以接收Teacher和它的子类数据类型的list集合,写个测试方法show3(list2);试试:

Student{name=&#39;zhaoliu&#39;, age=22, sex=1}
Teacher{name=&#39;sunba&#39;, age=30, sex=0}
로그인 후 복사

可以看到正常输出,因为集合中的数据都是Teacher的子类类型,如果我们将List<? extends Teacher> list改成List<? extends Student> list会出现什么情况?

Java 제네릭에서 자리 표시자 T와 의 차이점은 무엇입니까?

仔细看这张图,我们新建了一个list3并且声明数据类型为Teacher,这个时候调用show3(List<? extends Student> list) 就马上会报错的,错误信息提示Teacher不能转换成Student,因为Student是Teacher的子类,而我们只接受Student及它的子类,所以当然会报错了。

List<? super 数据类型> list

这种写法表示只接收指定的数据类型及它的父类类型,也简单的写段代码看看效果:

public static void show4(List<? super Student> list) {
    for (Object object : list) {
        System.out.println(object);
    }
}
로그인 후 복사

可以看出来,我们接收的是Student及它父类的集合,我们写两个集合数据然后调用试试。

List list4 = new ArrayList<>();
list4.add(new Student("sunba",30,0));
list4.add(new Teacher("zhaoliu",22,1));
show4(list4);
로그인 후 복사

在list中插入了一个Student和Teacher对象,看看结果:

Student{name=&#39;sunba&#39;, age=30, sex=0}
Teacher{name=&#39;zhaoliu&#39;, age=22, sex=1}
로그인 후 복사

没毛病,正常运行并输出。

下面我们来看看,如果我们是传递的 Student的子类的集合会咋样

Java 제네릭에서 자리 표시자 T와 의 차이점은 무엇입니까?

可以看到和之前的一样,会报错,理由也是一样的,以为我们已经定义了只能接收Student及其父类的数据类型。

最后来看一种情况

如果我定义List的时候没有指定数据类型,并且插入了一个Child,Student,Teacher,还是调用show4(List super Student> list)

테스트 코드를 통해 둘의 차이점을 직관적으로 느껴봅시다:

rrreeeJava 제네릭에서 자리 표시자 T와 의 차이점은 무엇입니까?실행 결과를 살펴보겠습니다:

Student{name='zhangsan', age=18, sex=0}
학생{name='lisi', 나이=28, 성별=0}
학생{name='wangwu', 나이=24, 성별=1}
***** ** ****구분선****************
학생{이름='zhaoliu', 나이=22, 성별=1}
선생님{ name='sunba', age=30, sex=0}

show2 메소드에서 show1과의 차이점을 알 수 있습니다. list2는 Student와 Teacher라는 두 가지 유형을 저장하고 데이터도 출력할 수 있으므로 다음과 같습니다. T와 의 차이점은 무엇입니까? 친구들, 한 번 알아볼까요? 확장된 쓰기 방법: Java 제네릭에서 자리 표시자 T와 의 차이점은 무엇입니까?

List 확장 데이터 유형> 목록

rrreee

List 확장 교사> 목록 이 쓰기 방법은 교사와 그 하위 항목을 받을 수 있음을 의미합니다. 클래스 데이터 유형의 목록 컬렉션의 경우 테스트 메서드 show3(list2);를 작성합니다. 🎜rrreee🎜 컬렉션의 데이터가 모두 Teacher의 하위 클래스이기 때문에 정상적인 출력을 볼 수 있습니다. 목록 확장 교사> 목록목록으로 변경하면 어떻게 되나요? 🎜🎜<img src="/static/imghw/default1.png" data-src="https://img.php.cn/upload/article/000/465/014/168379980974599.png" class="lazy" alt="Java 제네릭에서 자리 표시자 T와 ?의 차이점은 무엇입니까"> 🎜 🎜이 그림을 잘 보세요. 새로운 list3을 생성하고 데이터 유형을 Teacher로 선언했습니다. 이때 <code>show3(List<?extends Student> list)를 호출하면 즉시 오류가 보고됩니다. 오류 메시지는 Student가 Teacher의 하위 클래스이기 때문에 Teacher It can be Converted to Student로 메시지를 표시하며, 우리는 Student와 그 하위 클래스만 허용하므로 당연히 오류가 보고됩니다. 🎜🎜List super data type> list🎜🎜이러한 작성 방식은 지정된 데이터 유형과 해당 상위 유형만 수신된다는 의미이며 간단히 코드를 작성하여 효과를 확인할 수도 있습니다. : 🎜rrreee🎜 우리가 받는 것은 Student와 그 부모 클래스의 컬렉션이라는 것을 알 수 있습니다. 우리는 두 개의 컬렉션 데이터를 작성한 다음 이를 호출하여 시도합니다. 🎜rrreee🎜학생 및 교사 개체를 목록에 삽입하고 결과를 확인하세요. 🎜rrreee🎜아무 문제가 없습니다. 정상적으로 실행되고 출력됩니다. 🎜🎜Student 하위 클래스 컬렉션을 전달하면 어떤 일이 일어나는지 봅시다🎜🎜무엇입니까? Java Generics에서 자리 표시자 T와 ?의 차이점🎜🎜이전과 동일하다는 것을 알 수 있으며, 오류가 보고되고 이유도 같습니다. Student만 받을 수 있도록 정의했다고 생각하면 됩니다. 및 상위 클래스의 데이터 유형. 🎜🎜마지막으로 상황을 살펴보겠습니다🎜🎜List를 정의할 때 데이터 유형을 지정하지 않고 Child, Student, Teacher를 삽입해도 여전히 show4(List super Student> list)를 호출합니다. code> , 오류가 보고됩니까? 오류가 보고되지 않으면 결과는 어떻게 되나요? 🎜🎜🎜🎜🎜list는 여러 데이터 유형을 저장할 수 있으므로 오류가 보고되지 않는 것을 볼 수 있습니다. 그러면 show4 메소드를 호출하면 결과가 어떻게 될까요? 🎜🎜🎜🎜🎜프로그램이 정상적으로 실행되고 결과가 출력되는 것을 볼 수 있습니다. 우리가 받는 것은 Student 및 해당 상위 클래스 개체 데이터 유형입니다. Child가 Student를 상속하므로 프로그램은 자동으로 Child를 상위 클래스 Student로 변환합니다. 출력에 사용되므로 모두가 주의해야 합니다. 자동으로 위쪽으로 변환됩니다. 🎜

위 내용은 Java 제네릭에서 자리 표시자 T와 의 차이점은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

Video Face Swap

Video Face Swap

완전히 무료인 AI 얼굴 교환 도구를 사용하여 모든 비디오의 얼굴을 쉽게 바꾸세요!

인기 기사

<gum> : Bubble Gum Simulator Infinity- 로얄 키를 얻고 사용하는 방법
1 몇 달 전 By 尊渡假赌尊渡假赌尊渡假赌
Nordhold : Fusion System, 설명
1 몇 달 전 By 尊渡假赌尊渡假赌尊渡假赌
Mandragora : 마녀 트리의 속삭임 - Grappling Hook 잠금 해제 방법
4 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌

뜨거운 도구

메모장++7.3.1

메모장++7.3.1

사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전

SublimeText3 중국어 버전

중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기

스튜디오 13.0.1 보내기

강력한 PHP 통합 개발 환경

드림위버 CS6

드림위버 CS6

시각적 웹 개발 도구

SublimeText3 Mac 버전

SublimeText3 Mac 버전

신 수준의 코드 편집 소프트웨어(SublimeText3)

작곡가 : AI를 통한 PHP 개발 지원 작곡가 : AI를 통한 PHP 개발 지원 Apr 29, 2025 am 12:27 AM

AI는 작곡가 사용을 최적화하는 데 도움이 될 수 있습니다. 특정 방법에는 다음이 포함됩니다. 1. 종속성 관리 최적화 : AI는 종속성을 분석하고 최상의 버전 조합을 권장하며 충돌을 줄입니다. 2. 자동화 된 코드 생성 : AI는 모범 사례를 준수하는 composer.json 파일을 생성합니다. 3. 코드 품질 향상 : AI는 잠재적 인 문제를 감지하고 최적화 제안을 제공하며 코드 품질을 향상시킵니다. 이러한 방법은 기계 학습 및 자연어 처리 기술을 통해 구현되어 개발자가 효율성과 코드 품질을 향상시킬 수 있도록 도와줍니다.

데이터 처리 및 계산에 MySQL 기능을 사용하는 방법 데이터 처리 및 계산에 MySQL 기능을 사용하는 방법 Apr 29, 2025 pm 04:21 PM

MySQL 기능은 데이터 처리 및 계산에 사용될 수 있습니다. 1. 기본 사용에는 문자열 처리, 날짜 계산 및 수학 연산이 포함됩니다. 2. 고급 사용에는 복잡한 작업을 구현하기 위해 여러 기능을 결합하는 것이 포함됩니다. 3. 성능 최적화를 위해서는 WHERE 절에서 기능 사용 및 GroupBy 및 임시 테이블 사용을 피해야합니다.

MySQL의 문자 세트 및 Collation 규칙을 구성하는 방법 MySQL의 문자 세트 및 Collation 규칙을 구성하는 방법 Apr 29, 2025 pm 04:06 PM

MySQL에서 문자 세트 및 콜라주를 구성하는 방법은 다음과 같습니다. 1. 서버 수준에서 문자 세트 및 콜라주 설정 : setNames'Utf8 '; setcharactersetutf8; setCollation_connection = 'utf8_general_ci'; 2. 특정 문자 세트 및 콜라주를 사용하는 데이터베이스를 만듭니다. createAbaseexample_DBCHARACTERSETUTF8COLLATEUTF8_GENERAL_CI; 3. 테이블을 만들 때 문자 세트 및 콜라주를 지정하십시오 : CreateTableAmplipt_table (idint

MySQL에서 데이터베이스 이름을 바꾸는 방법 MySQL에서 데이터베이스 이름을 바꾸는 방법 Apr 29, 2025 pm 04:00 PM

MySQL에서 데이터베이스를 바꾸려면 간접적 인 방법이 필요합니다. 단계는 다음과 같습니다. 1. 새 데이터베이스를 만듭니다. 2. mysqldump를 사용하여 이전 데이터베이스를 내보내십시오. 3. 데이터를 새 데이터베이스로 가져옵니다. 4. 이전 데이터베이스를 삭제합니다.

C에서 싱글 톤 패턴을 구현하는 방법? C에서 싱글 톤 패턴을 구현하는 방법? Apr 28, 2025 pm 10:03 PM

C에서 싱글 톤 패턴을 구현하면 정적 멤버 변수 및 정적 멤버 함수를 통해 클래스의 인스턴스가 하나뿐입니다. 특정 단계에는 다음이 포함됩니다. 1. 개인 생성자를 사용하고 사본 생성자 및 할당 연산자를 삭제하여 외부 직접 인스턴스화를 방지합니다. 2. 정적 메소드 GetInstance를 통해 전역 액세스 포인트를 제공하여 하나의 인스턴스 만 생성되도록하십시오. 3. 스레드 안전의 경우 이중 확인 잠금 모드를 사용할 수 있습니다. 4. STD :: Shared_ptr과 같은 스마트 포인터를 사용하여 메모리 누출을 피하십시오. 5. 고성능 요구 사항의 경우 정적 로컬 변수를 구현할 수 있습니다. 싱글 톤 패턴은 글로벌 주 남용으로 이어질 수 있으며,이를주의해서 사용하고 대안을 고려하는 것이 좋습니다.

Java는 플랫폼 독립성을 고려하여 IoT (Internet of Things) 장치의 개발에서 어떤 역할을합니까? Java는 플랫폼 독립성을 고려하여 IoT (Internet of Things) 장치의 개발에서 어떤 역할을합니까? May 03, 2025 am 12:22 AM

javaplaysaSignificantroleiniotduetoitsplatformincentence.1) itallowscodetobewrittenonceandevices.2) java'secosystemprovidesusefullibrariesforiot.3) itssecurityfeaturesenhanceiotiotsystemsafety.hormormory.hormory.hustupletety.houghmormory

다른 서버에서 실행 해야하는 웹 애플리케이션에 Java를 사용하는 장점은 무엇입니까? 다른 서버에서 실행 해야하는 웹 애플리케이션에 Java를 사용하는 장점은 무엇입니까? May 03, 2025 am 12:13 AM

Java는 크로스 서버 웹 응용 프로그램을 개발하는 데 적합합니다. 1) Java의 "Write Once, Run Everywhere"철학은 JVM을 지원하는 모든 플랫폼에서 코드를 실행합니다. 2) Java는 Spring 및 Hibernate와 같은 도구를 포함하여 개발 프로세스를 단순화하는 풍부한 생태계를 가지고 있습니다. 3) Java는 성능 및 보안에서 훌륭하게 성능을 발휘하여 효율적인 메모리 관리 및 강력한 보안 보증을 제공합니다.

HTML 요소의 회전 효과를 설정하는 방법 HTML 요소의 회전 효과를 설정하는 방법 Apr 30, 2025 pm 02:42 PM

HTML에서 요소의 회전 효과를 설정하는 방법은 무엇입니까? CSS 및 JavaScript를 사용하여 달성 할 수 있습니다. 1. CSS의 변환 속성은 회전 (45deg)과 같은 정적 회전에 사용됩니다. 2. JavaScript는 변환 속성을 변경하여 구현되는 회전을 동적으로 제어 할 수 있습니다.

See all articles