Tag: generics

用于Java中看起来很奇怪的显式类型参数声明语法

我最近发现了一种奇怪的语法,用于在调用Java方法时显式声明generics类型。 例如: Collections.emptyList(); 返回一个空的List 。 然而,这似乎很愚蠢,因为 emptyList()的实现只是未经检查的类型转换(List) EMPTY_LIST ,这样所有结果都具有相同类型的擦除(并且是相同的对象。)此外,这种类型通常不需要显式类型声明,因为编译器通常可以推断出类型: List empty = Collections.emptyList(); 在做了一些挖掘之后,我发现了另外两次你想要使用这种语法,并且它们都是由于使用了Guava库并且显然试图在一行上放置太多语句 。 装饰集合,例如使用同步包装器,并且编译器无法推断类型。 如果取出类型声明,则以下内容不起作用: cannot convert from Set to Set : Set set = Collections.synchronizedSet(Sets.newHashSet()); 当编译器尝试制作过于具体的类型参数时,获取较少的特定类型参数。 例如,如果没有类型声明,则以下语句也会抱怨: cannot convert from Map to Map : Map toJson = ImmutableMap.of(“foo”, “bar”); 我觉得具有讽刺意味的是,在第一种情况下,推断类型参数过于笼统,在第二种情况下它们过于具体,但我认为这只是Java中generics系统的一个工件。 然而,除了在番石榴团队发明的这些奇怪的用例之外,这种语言结构本身似乎是可以避免的。 此外,我很清楚, 在上面的两个例子中 , 编译器都有一种推断类型参数的方法,开发人员只是选择不这样做。 是否有在Java编程中使用此构造所必需或​​有用的示例,还是仅仅为了使编译器更简单/ JDK开发人员的生活更容易存在?

Spring MVC:如何在ResponseEntity体中返回不同的类型

在我的请求处理程序中,我想做一些validation,并根据validation检查的结果,我将返回不同的响应(成功/错误)。 因此,我为响应对象创建了一个抽象类,并为失败案例和成功案例创建了2个子类。 代码看起来像这样,但它不编译,抱怨errorResponse和successResponse无法转换为AbstractResponse。 我是Java Generic和Spring MVC的新手,所以我不知道解决这个问题的简单方法。 @ResponseBody ResponseEntity createUser(@RequestBody String requestBody) { if(!valid(requestBody) { ErrorResponse errResponse = new ErrorResponse(); //populate with error information return new ResponseEntity (errResponse, HTTPStatus.BAD_REQUEST); } createUser(); CreateUserSuccessResponse successResponse = new CreateUserSuccessResponse(); // populate with more info return new ResponseEntity (successResponse, HTTPSatus.OK); }

inheritance的方法Object.clone()无法隐藏公共抽象方法

所以,我有一些狂野的,疯狂的代码,这使得编译器在我的脸上吐了几个小时以下错误: The inherited method Object.clone() cannot hide the public abstract method in IOrderable 罪魁祸首类如下(错误出现在通用的T中): public class MyInterval<T extends Xpto & Successorable> implements Cloneable { public MyInterval clone(){ MyInterval it = null; try { it = (MyInterval) super.clone(); it.max = it.max.clone(); it.min = (T) it.min.clone(); } catch (CloneNotSupportedException e) { // TODO Auto-generated catch block e.printStackTrace(); […]

方法返回类型以实现多个接口

是否可以指定一个返回实现两个或多个接口的对象的方法? 假设我们有以下接口: interface FooBar { [Foo] & [Bar] getFooBar(); } interface Foo { void doFoo(); } inteface Bar { void doBar(); } FooBar实现者需要提供getFooBar()方法,该方法返回一个满足Foo和Bar的类型的实例。 我到目前为止尝试的是使用generics: interface FooBar { T getFooBar() } class SomeImplementor implements FooBar { private FooAndBarImpl fSomeField; public T getFooBar() { return fSomeField; } } 鉴于FooAndBarImpl是由框架或库提供的某种类型并实现Foo和Bar我认为应该可行。 但是,它没有,因为“FooAndBarImpl无法转换为T”。 这是为什么? getFooBar()隐含的合同没有像我看到的那样被打破。 另一个解决方案是定义一个扩展Foo和Bar的新接口,并将其用作返回类型。 我在getFooBar()实现中返回fSomeField的空包装时没有多大意义。 编辑: 如果有人能解释为什么generics方法不起作用,我将不胜感激。 我只是没有看到它。

将Java Generics与Enums一起使用

更新:感谢所有帮助过的人 – 这个问题的答案在于我在更复杂的代码中没有注意到的内容以及我对Java5协变返回类型的不了解。 原帖: 今天早上我一直在玩弄东西。 虽然我知道我可以用不同的方式解决这个问题,但我发现自己已经痴迷于弄清楚为什么它不像我期望的那样工作。 在花了一些时间阅读这篇文章之后,我发现自己并没有更接近理解,所以我提出这个问题,看看我是不是真的很蠢,或者是否有一些我不明白的事情发生在这里。 我创建了一个自定义事件层次结构,如下所示 public abstract class AbstractEvent<S, T extends Enum> { private S src; private T id; public AbstractEvent(S src, T id) { this.src = src; this.id = id; } public S getSource() { return src; } public T getId() { return id; } } 具体实现如下: public class MyEvent extends […]

覆盖“等于”方法:如何确定参数的类型?

我正在尝试为参数化类重写equals方法。 @Override public boolean equals(Object obj) { if (this == obj) return true; if (obj == null) return false; if (!(obj instanceof Tuple)) return false; Tuple other = (Tuple) obj; //unchecked cast if (!a0.equals(other.a0) && !a0.equals(other.a1)) { return false; } if (!a1.equals(other.a1) && !a1.equals(other.a0)) { return false; } return true; } 如何确保other对象的与此相同?

Java:将对象转换为generics类型

在Java中从Object转换为其他类型时,为什么第二行会产生与转换相关的警告,但第一行不会? void a(Object o) { Integer i = (Integer) o; List list = (List) o; } /*Type safety: Unchecked cast from Object to List*/

Java Generics:将Object o的类与进行比较

假设我有以下课程: public class Test { public boolean sameClassAs(Object o) { // TODO help! } } 我如何检查o与E是同一类? Test test = new Test(); test.sameClassAs(“a string”); // returns true; test.sameClassAs(4); // returns false; 我无法从(Object o)更改方法签名,因为我覆盖了一个超类,所以不要选择我的方法签名。 我也不愿意尝试一个演员然后如果失败就抓住结果exception。

获得通用类型的“真实”类

如何获得generics类型的“真实”类? 例如: public class MyClass { public void method(){ //something System.out.println(T.class) //causes a compile error, I wont the class name //something } } 如果T =整数 输出: java.lang.Integer 如果T = String 输出: java.lang.String 谢谢

使用Jersey将REST资源作为List 获取

我正在尝试在Jersey中编写一个generics函数,它可以用来通过REST获取相同类型的对象列表。 我基于此论坛中的信息: 链接 @Override public List fetchResourceAsList(String url) { ClientConfig cc = new DefaultClientConfig(); Client c = Client.create(cc); if (userName!=null && password!=null) { c.addFilter(new HTTPBasicAuthFilter(userName, password)); } WebResource resource = c.resource(url); return resource.get(new GenericType<List>() {}); } 但是这不起作用。 如果我尝试执行它,我会收到以下错误: SEVERE: A message body reader for Java class java.util.List, and Java type java.util.List, and MIME media type […]