我有一个实现Iterable的类,以便用户可以使用迭代器。我正在使用泛型来允许用户使用任何类型并使用该类。
这是下面的工作代码,没有警告 -
public class CustomStackUsingArray<Type> implements CustomList<Type>, Iterable<Type> {
Type []arr;
public Iterator<Type> iterator() {
return (new ListIterator());
}
private class ListIterator implements Iterator<Type>{
//Implement Iterator here
}
//Implement other methods here
}
但是,如果我将ListIterator定义为这样 -
private class ListIterator<Type> implements Iterator<Type>
我在Eclipse中收到警告The parameter Type is hiding the type Type
为什么我在课后指定泛型类型时会抱怨?为了让我能够在课堂上使用Type,我不应该这样做吗?我在定义Type
时添加了CustomStackUsingArray
,但效果很好。
答案 0 :(得分:1)
当您说<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.boot.spring</groupId>
<artifactId>myjpademo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>myjpademo</name>
<description>Demo project for Spring Boot</description>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.4.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
(可能有多个类型参数)时,您告诉编译器您正在使用class Something<T>
定义新泛型类作为其参数。你可以说T
;这本来是合法的,但不是你想要的。它会创建一个新的泛型类,其中private class ListIterator<Type2> implements Iterator<Type2>
引用新类型参数的名称。当您说Type2
时,您实际上做的完全相同,但使用名为private class ListIterator<Type> implements Iterator<Type>
的类型参数而不是Type
。此Type2
与外层的Type
无关。此外,在这个新类中,每当你说Type
时,你指的是 new 类型参数,这意味着你不能再引用外部类型参数 - 它是隐藏的,是Eclipse告诉你的。
这一切都发生了,因为你告诉编译器你要创建一个新的泛型类。但你真的没有。你只想要一个内部类,它是你定义的外部泛型类的一部分(我认为)。因此,您需要取消第一个Type
。它应该按照你想要的方式工作。