为什么内部类会抱怨泛型类型?

时间:2017-07-24 03:02:23

标签: java generics

我有一个实现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,但效果很好。

1 个答案:

答案 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。它应该按照你想要的方式工作。