【관련 학습 권장사항: 기본 Java 튜토리얼】
때때로 매개변수화된 유형에서 유형 매개변수로 사용할 수 있는 유형을 제한하고 싶을 수도 있습니다. 예를 들어 숫자에 대해 작동하는 메서드는 Number의 인스턴스나 해당 하위 클래스 중 하나만 허용하기를 원할 수 있습니다. 이것이 제한된 유형 매개변수의 목적입니다.
제한된 매개변수 유형의 메서드 예
제한된 유형 매개변수를 선언하려면 유형 매개변수의 이름, 확장 키워드, 상한값(이 경우 Number
In)을 나열하세요. 이 경우 확장은 일반적으로 "확장"(클래스에서와 같이) 또는 "구현"(인터페이스에서와 같이)을 의미하는 데 사용됩니다.
package generics; /** * 定义受限制的方法 * * @author psdxdgK1DT * */ public class Box<T> { private T t; public void set(T t) { this.t = t; } public T get() { return t; } /** * 通过修改我们的通用泛型方法以包含此有界类型参数,现在编译将失败,因为我们对inspect的调用仍包含String: * By modifying our generic method to include this bounded type parameter * compilation will now fail, since our invocation of inspect still includes a String: * inspect:单词:检查 * @param <U> * @param u */ public <U extends Number> void inspect(U u) { System.out.println("T:" + t.getClass().getName()); System.out.println("U:" + u.getClass().getName()); } public static void main(String[] args) { Box<Integer> integerBox = new Box<Integer>(); integerBox.set(new Integer("some text")); integerBox.inspect("some test");这里会出现预编译错误 integerBox.inspect(10); } }
컴파일 오류를 나타내는 빨간색 물결선이 디스플레이에 나타납니다
컴파일이 강제로 수행되면 오류가 보고됩니다:
의 인수(문자열)프로그램 실행 결과:
스레드 "main" java의 예외. lang.Error: 해결되지 않은 컴파일 문제: Box 유형의 검사(U) 메서드는 generics.Box.main(Box.java:36)
에 적용할 수 없습니다.번역:
해결되지 않은 컴파일 오류
Box 클래스의 검사(U) 메서드는 (문자열) 유형 매개 변수에 적용할 수 없습니다.
제한된 유형 매개 변수를 사용하는 클래스는 제한된 경계 메서드를 호출할 수 있습니다.
할 수 있는 유형을 제한하는 것 외에도 일반 유형을 인스턴스화하는 데 사용되는 제한된 유형 매개변수를 사용하면 경계에 정의된 메소드를 호출할 수도 있습니다.
//使用受限类型参数的类 public class NaturalNumber<T extends Integer> { private T n; public NaturalNumber(T n) { this.n = n; } public boolean isEven() { return n.intValue() % 2 == 0; } // ...
isEven 메소드는 Integer 클래스에 정의된 intValue 메소드를 n으로 호출합니다.
다중 경계
이전 예에서는 단일 경계가 있는 유형 매개변수의 사용을 보여주지만 유형 매개변수는 여러 경계를 가질 수 있습니다.
dd789cdf57e180c5af1fcaff9a63d026 { /* … */ } 경계 A가 먼저 지정되지 않으면 컴파일 시간 오류가 발생합니다.
class D 633f90ec0447399c18fc4dce44f73cb0 { /* … */ } // 컴파일 시간 오류
일반 알고리즘
제한된 유형 매개변수는 일반 알고리즘 구현의 핵심입니다. 지정된 요소 elem보다 큰 배열 T[]의 요소 수를 계산하는 다음 방법을 고려하십시오.
public static <T> int countGreaterThan(T[] anArray, T elem) { int count = 0; for (T e : anArray) if (e > elem) // compiler error ++count; return count; } The implementation of the method is straightforward, but it does not compile because the greater than operator (>) applies only to primitive types such as short, int, double, long, float, byte, and char. You cannot use the > operator to compare objects. To fix the problem, use a type parameter bounded by the Comparable<T> interface: public interface Comparable<T> { public int compareTo(T o); } The resulting code will be: public static <T extends Comparable<T>> int countGreaterThan(T[] anArray, T elem) { int count = 0; for (T e : anArray) //因为这里的T是受限制的类型参数,实现了Comparable接口,于是可以使用接口的方法compareTo if (e.compareTo(elem) > 0) ++count; return count; }
관련 학습 권장 사항: 프로그래밍 비디오
위 내용은 Java에서 제한된 유형 매개변수를 정의하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!