我有一个泛型课,Foo<T>
.在一个方法中Foo
,我想得到类型为T的类实例,但我无法调用T.class
.
使用它的首选方法是什么T.class
?
在使用泛型时我在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>
).
这似乎很容易,但我不知道该怎么做.
我想为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) 考虑以下:
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?
我有一个方法,并检查method.getParameterTypes()[0]
,这是一个java.util.List
.但我想弄清楚包含类型是什么,例如,如果它是一个java.util.List<String>
我想要弄清楚它应该保持字符串.
我该怎么做呢?
谢谢!
我想创建一个休息来在服务器和客户端之间进行通信.
下面给出的构造函数:
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.
我有以下课程:
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作为参数.
我有一个参数化类:
class ParameterizedClass<T extends AbstractSomething> {
}
Run Code Online (Sandbox Code Playgroud)
电话:
new ParameterizedClass<Something>();
Run Code Online (Sandbox Code Playgroud)
那么如何T
通过使用Java Generics 获得实际类型?
还有其他相关问题,例如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) 我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 ×10
generics ×6
reflection ×3
class ×1
eclipselink ×1
enums ×1
java-7 ×1
jpa ×1
spring ×1