> Java > Java인터뷰 질문들 > Java의 일반적인 메커니즘에 대해 이야기합시다.

Java의 일반적인 메커니즘에 대해 이야기합시다.

王林
풀어 주다: 2021-01-27 09:59:06
앞으로
2271명이 탐색했습니다.

Java의 일반적인 메커니즘에 대해 이야기합시다.

인터뷰어: Java의 일반적인 메커니즘이 무엇인지 알려주세요.

(학습 동영상 공유: java 동영상 튜토리얼)

Lite 버전 답변

Java를 개발할 때 다이아몬드 구문 <을 사용하면 클래스, 인터페이스 또는 메소드에 다음과 같은 일반 참조를 허용하는 클래스 그룹이 있습니다. 매개변수, 일반 클래스는 궁극적으로 꺾쇠 괄호 안의 규칙에 의해 정의됩니다. 일반적으로 일반 클래스는 대문자(대개 문자 T)로 표시됩니다. 나중에 Java 컴파일러에서 컴파일한 후에 일반 유형은 지워지고 다음 항목에 따라 대체됩니다. 사용되는 특정 클래스. Generic은 클래스 바이트코드를 생성하므로 Jvm에 투명합니다.

Deluxe 버전 답변

Generics는 JDK1.5에서 공식적으로 도입되었습니다.

Java는 일반 배경을 도입했습니다

Java 컬렉션에서는

    List list=new ArrayList();
    list.add("String");
    list.add(1024);
로그인 후 복사

와 같이 여러 유형을 넣을 수 있습니다. 이는 JDK1.5 이전에는 일반적인 사용법이었습니다. 그것은 오늘날의 JDK에 배치되며 허용되므로 이와 유사한 컬렉션을 사용하면 컬렉션에 어떤 유형이 배치되는지에 대한 몇 가지 문제가 발생할 것입니다. 유감스럽게도 컬렉션을 만든 사람만 알고 있고 다른 호출자는 전혀 판별이 불가능하므로 대규모 프로젝트에서는 문제가 발생하기 매우 쉽습니다.호출자가 컬렉션의 개체를 강제 전송하는 경우 유형이 잘못되면 이러한 오류가 보고되지 않습니다. JDK에서는 비슷한 문제를 해결하기 위해 제네릭을 도입한 것으로 나타났습니다.

제네릭 유형

제네릭 도입 후 컴파일 단계에서 해당 유형이 요구 사항을 충족하는지 확인할 수 있으므로 블라인드 유형 변환이 상당 부분 제거됩니다. 제네릭은 주로 컴파일러에서 작동하며 JVM은 실행 중일 때 제네릭을 인식할 수 없습니다. 제네릭은 일반 제네릭과 와일드카드 제네릭으로 구분됩니다.

1. 일반 제네릭

이름에서 알 수 있듯이 이 유형의 제네릭은 호출 시 모든 유형 전달을 지원하지만 호출 시 등호 왼쪽과 오른쪽의 제네릭은 일관성이 있어야 합니다. JDK1.7의 오른쪽에 있는 다이아몬드는 생략 가능합니다.

class Test<T>{...} //声明时
Test<Integer> test = new Test<Integer>(); //调用时
Test<Integer> test = new Test(); //1.7调用时
로그인 후 복사

3. 제한된 제네릭

<?>//无界泛型,任意类型都匹配
<T extends ClassA>//有界泛型 - 继承自某父类
<T extends InterfaceB>//有界泛型 - 实现某接口
<T extends ClassA & InterfaceB & InterfaceC ... >//有界泛型 - 多重边界
<T super ClassC>//有界泛型 - 指定类父类
로그인 후 복사

일반 삭제

앞서 언급했듯이 제네릭은 코드를 작성하고 컴파일할 때만 작동하는 반면 Jvm 로딩 클래스는 실행 시 무감각하고 투명합니다. 간단히 말해서 컴파일러 제네릭은 삭제되기 때문입니다. 느슨하게는 클래스나 메소드의 <> 꺾쇠 괄호가 제거되고 꺾쇠 괄호 안의 규칙에 따라 특정 클래스로 대체되므로 Jvm이 전혀 실행되지 않습니다. 이는 호환성을 위해 수행된 것으로, 앞서 언급한 바와 같이 제네릭은 JDK1.5에서만 도입되었기 때문에 기존 JVM을 크게 수정할 필요는 없습니다. 컴파일러가 인식할 수 있지만 가상 머신에서는 인식할 수 없는 일종의 구문을 사람들은 이 구문을 설탕(suger)이라고 부릅니다. 컴파일러가 이를 해독한 후 실행을 위해 가상 머신에 맡깁니다.

(권장 그래픽 튜토리얼: Java 입문 튜토리얼)

일반 삭제 메커니즘

//Pair的泛型
public class Pair<T> {

    private T mFirst;
    private T mSecond;

    public T getmFirst() {
        return mFirst;
    }

    public void setmFirst(T mFirst) {
        this.mFirst = mFirst;
    }

    public T getmSecond() {
        return mSecond;
    }

    public void setmSecond(T mSecond) {
        this.mSecond = mSecond;
    }
}

//Pair的原始类型
//无论何时定义一个泛型类型,都会自动提供一个相应的 原始类型
public class Pair {

    private Object mFirst;
    private Object mSecond;

    public Object getFirst() {
        return mFirst;
    }

    public void setFirst(Object mFirst) {
        this.mFirst = mFirst;
    }

    public Object getSecond() {
        return mSecond;
    }

    public void setmSecond(Object mSecond) {
        this.mSecond = mSecond;
    }
}

//如果调用Pair<T extends String>编译擦除后得到如下=
class Pair{
    private String mFirst;
    private String mSecond;
    ...
}
로그인 후 복사

제네릭이 메소드의 입력 매개변수로 사용되면 삭제 후 와일드카드 제네릭의 하한으로 대체됩니다. add 메소드

public static void insertElements(List<? super A> list){
    //Add进来的都是层级“小于等于”A的,也就是下界
    list.add(new A());
    list.add(new B());
    list.add(new C());
}
로그인 후 복사

제네릭이 메소드의 반환 매개변수로 사용되면 삭제 후 get 메소드와 같은 와일드카드 제네릭의 상한으로 대체됩니다.

public void processElements(List<? extends A> elements){
   //for循环挨个get list 里的数据,都当做A,也就是都当做上界
   for(A a : elements){
      System.out.println(a.getValue());
   }
}
로그인 후 복사

제네릭 유형에 대해 아무리 말해도 삭제 및 내가 읽은 블로그 수는 공식 정의만큼 좋지 않습니다. 정확합니다. 여기에 유형 삭제에 대한 Oracle 공식 문서 섹션이 있습니다.

Type Erasure
Generics were introduced to the Java language to provide tighter type checks at compile time and to support generic programming. To implement generics, the Java compiler applies type erasure to:
Replace all type parameters in generic types with their bounds or Object if the type parameters are unbounded. The produced bytecode, therefore, contains only ordinary classes, interfaces, and methods.Insert type casts if necessary to preserve type safety.Generate bridge methods to preserve polymorphism in extended generic types.Type erasure ensures that no new classes are created for parameterized types; consequently, generics incur no runtime overhead.
로그인 후 복사

더 많은 인터뷰 질문을 보려면 다음을 클릭하세요: java 인터뷰 질문 및 답변

위 내용은 Java의 일반적인 메커니즘에 대해 이야기합시다.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
원천:juejin.im
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿