Java 제네릭에서 자리 표시자 T와 의 차이점은 무엇입니까?
첫 번째 두 가지 코드:
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='zhaoliu', age=22, sex=1} Teacher{name='sunba', age=30, sex=0}
可以看到正常输出,因为集合中的数据都是Teacher的子类类型,如果我们将List<? extends Teacher> list
改成List<? extends Student> list
会出现什么情况?
仔细看这张图,我们新建了一个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='sunba', age=30, sex=0} Teacher{name='zhaoliu', age=22, sex=1}
没毛病,正常运行并输出。
下面我们来看看,如果我们是传递的 Student的子类的集合会咋样
可以看到和之前的一样,会报错,理由也是一样的,以为我们已经定义了只能接收Student及其父类的数据类型。
最后来看一种情况
如果我定义List的时候没有指定数据类型,并且插入了一个Child,Student,Teacher,还是调用show4(List super Student> list)
rrreee실행 결과를 살펴보겠습니다:
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와 의 차이점은 무엇입니까? 친구들, 한 번 알아볼까요? 확장된 쓰기 방법:
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 하위 클래스 컬렉션을 전달하면 어떤 일이 일어나는지 봅시다🎜🎜
show4(List super Student> list)를 호출합니다. code> , 오류가 보고됩니까? 오류가 보고되지 않으면 결과는 어떻게 되나요? 🎜🎜🎜🎜🎜list는 여러 데이터 유형을 저장할 수 있으므로 오류가 보고되지 않는 것을 볼 수 있습니다. 그러면 show4 메소드를 호출하면 결과가 어떻게 될까요? 🎜🎜🎜🎜🎜프로그램이 정상적으로 실행되고 결과가 출력되는 것을 볼 수 있습니다. 우리가 받는 것은 Student 및 해당 상위 클래스 개체 데이터 유형입니다. Child가 Student를 상속하므로 프로그램은 자동으로 Child를 상위 클래스 Student로 변환합니다. 출력에 사용되므로 모두가 주의해야 합니다. 자동으로 위쪽으로 변환됩니다. 🎜
위 내용은 Java 제네릭에서 자리 표시자 T와 의 차이점은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

핫 AI 도구

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

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

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

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

인기 기사

뜨거운 도구

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기

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

스튜디오 13.0.1 보내기
강력한 PHP 통합 개발 환경

드림위버 CS6
시각적 웹 개발 도구

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

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

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

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

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

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

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

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

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