相关疑难解决方法(0)

如何获取泛型类型T的类实例

我有一个泛型课,Foo<T>.在一个方法中Foo,我想得到类型为T的类实例,但我无法调用T.class.

使用它的首选方法是什么T.class

java generics

659
推荐指数
12
解决办法
64万
查看次数

Java泛型类型擦除:何时以及发生了什么?

在Oracle的网站上读到了Java的类型擦除.

什么时候发生类型擦除?在编译时还是运行时?当班级加载?当类被实例化时?

很多站点(包括上面提到的官方教程)都说在编译时会发生类型擦除.如果在编译时完全删除了类型信息,那么当调用使用泛型的方法而没有类型信息或错误的类型信息时,JDK如何检查类型兼容性?

考虑以下示例:Say class A有一个方法,empty(Box<? extends Number> b).我们编译A.java并获取类文件A.class.

public class A {
    public static void empty(Box<? extends Number> b) {}
}
Run Code Online (Sandbox Code Playgroud)
public class Box<T> {}
Run Code Online (Sandbox Code Playgroud)

现在我们创建另一个类B,该类empty使用非参数化参数(原始类型)调用该方法:empty(new Box()).如果我们编译B.javaA.class在类路径中,javac的是足够聪明,引发警告.所以A.class 一些类型信息存储在其中.

public class B {
    public static void invoke() {
        // java: unchecked method invocation:
        //  method empty in class A is applied to given types
        //  required: Box<? extends java.lang.Number>
        //  found: …
Run Code Online (Sandbox Code Playgroud)

java generics type-erasure

233
推荐指数
6
解决办法
8万
查看次数

Java:如何从泛型类型中获取类文字?

通常情况下,我看到人们使用这样的类文字:

Class<Foo> cls = Foo.class;
Run Code Online (Sandbox Code Playgroud)

但是,如果类型是通用的,例如List?这工作正常,但有一个警告,因为List应该参数化:

Class<List> cls = List.class
Run Code Online (Sandbox Code Playgroud)

那么为什么不加一个<?>呢?好吧,这会导致类型不匹配错误:

Class<List<?>> cls = List.class
Run Code Online (Sandbox Code Playgroud)

我认为这样的东西可行,但这只是一个简单的'语法错误:

Class<List<Foo>> cls = List<Foo>.class
Run Code Online (Sandbox Code Playgroud)

我如何Class<List<Foo>>静态获取,例如使用类文字?

可以@SuppressWarnings("unchecked")摆脱造成在第一个例子中的非参数使用目录的警告,Class<List> cls = List.class但我宁愿不要.

有什么建议?

java generics class literals

185
推荐指数
6
解决办法
14万
查看次数

标签 统计

generics ×3

java ×3

class ×1

literals ×1

type-erasure ×1