相关疑难解决方法(0)

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

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

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

java generics

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

获取泛型类的泛型参数的类型名称

在使用泛型时我在java中遇到一个小问题.我有一节课A:

public class A<T>
Run Code Online (Sandbox Code Playgroud)

在一个方法中A,我需要获取类型名称T.有没有办法找到s使用的字符串T

(如果我创建A<String> temp = new A<String>();,我希望能够获得java.lang.String一点 - 我必须使用通用性,因为我的一个方法必须返回一个List<T>).

这似乎很容易,但我不知道该怎么做.

java generics

31
推荐指数
4
解决办法
6万
查看次数

是否可以为JPA编写通用枚举转换器?

我想为JPA编写一个Converter,它将任何枚举存储为UPPERCASE.我们遇到的一些枚举不遵循惯例只使用大写字母,因此在重构之前我仍然存储未来值.

到目前为止我得到了什么:

package student;

public enum StudentState {

    Started,
    Mentoring,
    Repeating,
    STUPID,
    GENIUS;
}
Run Code Online (Sandbox Code Playgroud)

我希望"已启动"存储为"已启动"等等.

package student;

import jpa.EnumUppercaseConverter;

import javax.persistence.*;
import java.io.Serializable;
import java.util.Date;

@Entity
@Table(name = "STUDENTS")
public class Student implements Serializable {
    private static final long serialVersionUID = 1L;

    @Id
    @Column(name = "ID")
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long mId;

    @Column(name = "LAST_NAME", length = 35)
    private String mLastName;

    @Column(name = "FIRST_NAME", nullable = false, length = 35)
    private String mFirstName;

    @Column(name = "BIRTH_DATE", nullable = false)
    @Temporal(TemporalType.DATE) …
Run Code Online (Sandbox Code Playgroud)

java enums jpa eclipselink

24
推荐指数
3
解决办法
2万
查看次数

Java泛型 - 类型推导

考虑以下:

 public class GenericTest {
    static void print(int x) {
        System.out.println("Int: " + x);
    }
    static void print(String x) {
        System.out.println("String: " + x);
    }

    static void print(Object x) {
        System.out.println("Object: " + x);
    }

    static <T> void printWithClass(T t) {
        print(t);
    }
    public static void main(String argsp[]) {
        printWithClass("abc");
    }
}
Run Code Online (Sandbox Code Playgroud)

它打印Object:abc.为什么不打印字符串:abc?

java generics

11
推荐指数
2
解决办法
975
查看次数

你如何获得带有反射的List <Type>?

我有一个方法,并检查method.getParameterTypes()[0],这是一个java.util.List.但我想弄清楚包含类型是什么,例如,如果它是一个java.util.List<String>我想要弄清楚它应该保持字符串.

我该怎么做呢?

谢谢!

java reflection

11
推荐指数
1
解决办法
3万
查看次数

无法选择参数化类型

我想创建一个休息来在服务器和客户端之间进行通信.

下面给出的构造函数:

public class RestHelper<I, R> {
    public RestHelper(String url, I input, Class<R> output){
        ResponseEntity<R> responseEntity = restTemplate.exchange(url, HttpMethod.POST, requestEntity, output );
    }
}
Run Code Online (Sandbox Code Playgroud)

对于普通类型,我可以这样做:

RestHelper<User, Result> helper = new RestHelper<>(url, user, Result.class);
Run Code Online (Sandbox Code Playgroud)

我如何传递泛型类型,如:

ResultContainData<Boolean>
Run Code Online (Sandbox Code Playgroud)

以下代码无效:

    ResultContainData<Boolean> result = new ResultContainData<>();
    RestHelper<User, ResultContainData<Boolean>> helper = new RestHelper<>(url, user, (Class<ResultContainData<Boolean>>) ((ParameterizedType) result.getClass().getGenericSuperclass()).getActualTypeArguments()[0]);
Run Code Online (Sandbox Code Playgroud)

我收到了运行时错误:无法转换为ParameterizedType.

java spring

11
推荐指数
2
解决办法
2万
查看次数

Java - 在方法参数中使用Class参数

我有以下课程:

public class Publisher<T> {

    private static final Class[] SUPPORTED_CLASSES = new Class[]{T1.class, T2.class};

    public Publisher() {
        if(Arrays.asList(SUPPORTED_CLASSES).contains(T)) { // error: expression expected!
            System.out.println("Class not supported!");
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

如何检查类参数是否符合实现?
在上面的例子中,我不能使用类参数T作为参数.

java generics java-7

8
推荐指数
2
解决办法
2791
查看次数

如何学习泛型类的实际类型参数?

我有一个参数化类:

class ParameterizedClass<T extends AbstractSomething> {
}
Run Code Online (Sandbox Code Playgroud)

电话:

new ParameterizedClass<Something>();
Run Code Online (Sandbox Code Playgroud)

那么如何T通过使用Java Generics 获得实际类型?

java generics reflection

7
推荐指数
2
解决办法
3132
查看次数

在通用上下文中使用getActualTypeArguments

还有其他相关问题,例如6624113,3403909,4516891但我的问题是更简单,更具体.

我想在运行时知道我的类参数化了什么类型 - 我想要一个类型参数类型的Class对象.由于类型擦除,表达式T.class不起作用,并且没有像typeof(T)C#中那样的函数来获取它.

但是,通过ParameterizedType和相关类可以获得一些"超级反射" ,这几乎可以解决所有问题.

import java.lang.reflect.ParameterizedType;

public class MyClass<T> {
    public static void main( String[] args ) {
        new MyClass<Integer>().printTypeParam();
    }

    public void printTypeParam() {
        class DummyT extends MyClass<T> {}
        class DummyString extends MyClass<String> {}

        ParameterizedType ptT =
            ((ParameterizedType) DummyT.class.getGenericSuperclass() );

        ParameterizedType ptString =
            ((ParameterizedType) DummyString.class.getGenericSuperclass() );

        System.out.println( "DummyT: " + ptT + " " + ptT.getActualTypeArguments()[0] );
        System.out.println( "DummyString: " + ptString + " " …
Run Code Online (Sandbox Code Playgroud)

java generics reflection class

7
推荐指数
1
解决办法
7228
查看次数

从泛型类返回数组

ClassCastException运行这个时遇到错误,因为在运行代码时d隐式转换为double.但是,如果我将引用更改为d in,Object[]则它不能成为set函数的参数.如果我将set函数更改为接受a Object[]然后一切正常,但是如果有人在非类型的对象上调用set,那么该类将在运行时失败N.

我需要一个可以get()使用旧数组(或其克隆)并且可以将set()数据传输到新数组的解决方案.

public class Foo<N> {

    public static void main(String[] args) {
        Foo<Double> foo = new Foo<Double>();
        Double[] d = foo.get();

        // do stuff to d ...

        foo.set(d);
    }

    N[] data;

    public Foo() {
        data = (N[]) new Object[2];
    }

    public N[] get() {
        return (N[]) data;
    }

    public void set(N[] data) {
        this.data = data;
    }

}
Run Code Online (Sandbox Code Playgroud)

java

7
推荐指数
1
解决办法
141
查看次数

标签 统计

java ×10

generics ×6

reflection ×3

class ×1

eclipselink ×1

enums ×1

java-7 ×1

jpa ×1

spring ×1