자바 모델 형식 지우 기
『8195』는 지난 범례 블 로그 에서 주로 범례 의 기본 적 인 사용 과 디자인 을 설명 하고 본 블 로그 에서 범례 를 사용 하 는 데 가 져 온 문제 와 해결 방법 을 설명 했다.*8195:8195:자바 모델 을 사용 할 때 우 리 는 보통 많은 문제 에 부 딪 힐 수 있 습 니 다.예 를 들 어 T.class 를 사용 할 수 없고 T.method()를 직접 사용 할 수 없고 범례 매개 변 수 를 통 해 방법 을 다시 불 러 올 수 없습니다.이 모든 원인 은-'범례 유형 지우 기'로 귀 결 됩 니 다.
유형 지우 기
jdk 1.5 이전 에는 범례 가 지원 되 지 않 았 다 는 것 을 알 고 있 습 니 다.List 를 예 로 들 면 List 에서 add()를 할 때 유형 검 사 를 하지 않 기 때문에 컴 파일 기간 에 어떤 유형의 대상 을 저장 하 더 라 도 컴 파일 오류 가 발생 하지 않 지만 실행 할 때 다른 유형 이 감지 되면 실 행 됩 니 다.범례 가 나타 나 면 컴 파일 단계 에서 저장 대상 의 유형 을 검사 하고 다른 유형 을 저장 하면 컴 파일 단계 에서 오 류 를 보고 합 니 다.그 러 니까 모델 은 운행 기 이상 을 컴 파일 기 이상 으로 전환 시 키 는 수단 이다.그 렇 기 때문에 모델 은 우리 가 소스 코드 를 쓸 때 만 유형 검사,유형 전환 등 작업 을 해 준다.컴 파일 이 끝 난 후에 운영 기간 에 어떠한 범례 문법 도 없다.이 소스 코드 에서 범례 를 제거 하 는 과정 은 바로 범례 의 유형 을 지 우 는 것 이다.
3.왜 범례 형식 으로 지 워 야 합 니까?
사실은 말 하기 가 매우 간단 합 니 다.왜냐하면 지금까지 어떤 버 전의 jvm 도 운영 단계 에서 범례 를 지원 하지 않 았 기 때 문 입 니 다.그러나 범례 문법 은 실제 개발 에 있어 반드시 필요 합 니 다.많은 다른 언어 들 이 범례(예 를 들 어 C++의 템 플 릿,python 은 anything 으로 perform 범 형 방법 을 설명 하 는 등)자바 언어 가 뒤떨어 져 서 는 안 됩 니 다.그러나 역사적 인 원인 으로 인해...자바 는 버 전 1.0 에서 범 형 을 지원 하지 않 기 때문에 많은 기 존 라 이브 러 리 가 범 형 을 지원 하지 않 는 자바 버 전에 서 만 들 어 졌 다.후기 에 범례 를 넣 으 려 면 기 존의 비 일반화 라 이브 러 리 가 일반화 된 클 라 이언 트 에서 사용 할 수 있 도록 해 야 합 니 다.그래서 자바 개발 자 는 절충 하 는 방법 을 사 용 했 습 니 다.바로 지 우 는 것 입 니 다.구체 적 인 지우 기 과정 은 다음 과 같은 코드 를 보십시오.
class User<T extends Fruit> {
public T work(T t){
return null;
}
}
class Fruit{}
class Apple extends Fruit{}
class Pear extends Fruit{}
:
class User {
public Fruit work(Fruit t){
return null;
}
}
우 리 는 범례 의 언어 가 제거 되 는 것 을 보 았 다.또한 범례 의 유형 은 가장 왼쪽 경계(최상 위 부류)로 제한 되 었 다.그러면 범례 의 유형 지우 기 과정 은 다음 과 같이 요약 할 수 있다.*8195°8195°2.모든 유형의 인 자 를 제거 합 니 다. 범 형 을 통 해 지 웁 니 다.문법 에 범 형 이 없 지만 운영 단계 에서 들 어 오 는 유형 을 Fruit 의 하위 클래스 로 제한 할 수 있 습 니 다.이것 이 바로 유형 지우 기 가 존재 하 는 의미 입 니 다.그러나 이렇게 간단 한 지우 기만 한다 면 다음 과 같은 코드 를 보십시오.
public interface Comparable<T> {
public int compareTo(T o);
}
class User implements Comparable<User> {
@Override
public int compareTo(User o) {
return 0;
}
}
:
public interface Comparable {
public int compareTo(Object o);
}
class User implements Comparable {
public int compareTo(Object o) {
return compareTo((User)o);
}
public int compareTo(User o){
}
}
,Comparable ,compareTo Object , User compareTo User , Overwrite , Object , 。
4.범례 유형 지우 기 가 가 져 온 문제 및 해결 방법
1.범례 를 가 져 올 수 없 는 class
class User{
public void eat(){
this.printClass(T.class);// , , T 。
}
private void printClass(Class clazz){
System.out.println(clazz);
}
}
이 문 제 를 해결 하기 위해 저희 가 자주 사용 하 는 방법 은 RTTI,즉 Run-Time Type Identification 을 사용 하 는 것 입 니 다.운행 시 유형 식별 을 통 해 구체 적 인 코드 는 다음 과 같 습 니 다.
class User{
private Class clazz;
public User(Class clazz){
this.clazz = clazz;
}
public void eat(){
this.printClass(clazz);
}
private void printClass(Class clazz){
System.out.println(clazz);
}
public static void main(String[] args){
User u = new User(Fruit.class);
u.eat();
}
}
우리 가 User 를 실례 화 할 때 반드시 범 형의 class 도 들 어가 야 한다.이렇게 하면 해결 할 수 있다.사실은 많은 범 형 dao 디자인 이 바로 이런 사고방식 이다.
2.범례 방법 을 직접 호출 할 수 없습니다.
class User{
public void eat(T t){
t.weight();// , , T Object weight ,
}
}
여기 서도 하나의 절충안 만 사용 할 수 있 습 니 다.우 리 는 T 를 특정한 유형의 하위 클래스 로 한정 할 수 있 습 니 다.이렇게 하면 부모 클래스 의 방법 을 호출 할 수 있 습 니 다.코드 는 다음 과 같 습 니 다.
class User<T extends Fruit>{
public void eat(T t){
t.weight();
}
}
위의 코드 는 틀 리 지 않 습 니 다.유형 은 지 워 지지 만 유형 은 Fruit 로 한정 되 며 fruit 는 weight 방법 을 가지 고 있 습 니 다.
3.패 러 다 임 을 통 해 리 셋 할 수 없 음
class User{
// , , List , List
public void eat(List list){}
public void eat(List list){}
}
이런 eat 방법 은 List 에 들 어 갈 수도 있 고 List 에 들 어 갈 수도 있 기 를 바 라 는 것 일 것 입 니 다.이 문 제 를 해결 하려 면 마스크 를 사용 하 세 요.마스크 는 지난 블 로그 에 도 소개 되 어 있 고 모 르 는 것 은 볼 수 있 습 니 다.코드 는 다음 과 같 습 니 다:
class User{
public void eat(List extends Fruit> list){
}
public static void main(String [] args){
User u = new User();
List applist = new ArrayList();
u.eat(applist);
List pearList = new ArrayList();
u.eat(pearList);
}
}
『8195』는 마스크 방식 을 통 해 상기 문 제 를 해결 했다.
4.범용 클래스 의 정적 변 수 는 공 유 됩 니 다.
public class StaticTest{
public static void main(String[] args){
User gti = new User();
gti.var=1;
User gts = new User();
gts.var=2;
System.out.println(gti.var);
}
}
class User{
public static int var=0;
public void nothing(T x){}
}
출력 결과-2!형식 지우 기 를 통 해 모든 범 형 인 스 턴 스 는 같은 바이트 코드 와 연결 되 어 있 기 때문에 범 형 류 의 모든 정적 변 수 는 공 유 됩 니 다.물론 유형 지우 기 에 따 른 문제 가 많 으 니 일일이 열거 하지 않 는 다.
총화
모델 은 자바 인 코딩,특히 디자인 에서 자주 사용 하 는 문법 입 니 다.디자인 과정 에서 발생 하 는 문 제 를 해결 하려 면 jvm 가 모델 을 처리 하 는 과정 을 깊이 이해 해 야 합 니 다.본 블 로그 가 여러분 에 게 유용 하 기 를 바 랍 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Tailwind를 ASP.NET Core 프로젝트에 통합우리는 을 사용합니다. 에서 코드를 찾을 수 있습니다. 면도기 페이지 구조를 추가합니다. "node_modules"가 설치되었습니다. "tailwind.config.js"파일이 생성되었습니다. 모든 .razor 및 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.