具有无界通配符的Java泛型? [英] Java generics with unbounded wildcard?

查看:147
本文介绍了具有无界通配符的Java泛型?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个将对象转换为字符串的接口:

  public interface Converter< T> {
String asString(T object);
}

以及一张存储所有可用转换器的地图:

  Map< Class <?>,Converter<>> converterMap; 

现在我有一个要转换的异构数据列表:

 列表<?> data = fetchData(); 
列表< String> stringData = new ArrayList<>(data.size());
for(Object datum:data){
stringData.add(convertrMap.get(datum.getClass())。asString(datum));
}

但是这段代码无法编译:

  error:interface asString in interface Converter< T>不能应用于给定的类型; 
stringData.add(converterMap.get(datum.getClass())。asString(datum));
required:CAP#1
found:Object
reason:actual argument对象无法通过方法调用转换转换为CAP#1
其中T是类型变量:
T扩展在接口Converter
中声明的对象,其中CAP#1是一个新的类型变量:
CAP#1扩展了Object从捕获?

我该如何更改代码?

解决方案

您遇到通配符问题捕捉
Java无法识别将从 List <?>> 数据收到的类型。
尝试用以下两种方式中的任何一种重构代码:

方法1:更改您的界面如下

  interface Converter {
String asString(Object object);方法2:方法捕获通配符:
通过类型推断



创建一个如下的帮助方法,

  /创建/ Helper方法,以便通过类型推断可以捕获通配符
//。
私人< T> void helper(List< T> data){
Map< Class<>,Converter< T>> converterMap = null;
列表< String> stringData = null; (T datum:data){
stringData.add(converterMap.get(datum.getClass())。asString(datum));








如下调用这个帮助方法

 列表<?> data = fetchData(); 
helper(data);


I have an interface to convert object to string:

public interface Converter<T> {
    String asString(T object);
}

And a map to store all available converters:

Map<Class<?>, Converter<?>> converterMap;

Now I have a list of heterogeneous data to convert like this:

List<?> data = fetchData();
List<String> stringData = new ArrayList<>(data.size());
for (Object datum : data) {
    stringData.add(convertrMap.get(datum.getClass()).asString(datum));
}

But this code doesn't compile:

error: method asString in interface Converter<T> cannot be applied to given types;
            stringData.add(converterMap.get(datum.getClass()).asString(datum));
  required: CAP#1
  found: Object
  reason: actual argument Object cannot be converted to CAP#1 by method invocation conversion
  where T is a type-variable:
    T extends Object declared in interface Converter
  where CAP#1 is a fresh type-variable:
    CAP#1 extends Object from capture of ?

How should I change the code?

解决方案

You are facing issue called wildcard capture. Java is unable to identify the type that will be received from the List<?> data. Try refactoring your code in any of the two ways

Method 1: Change your interface as below

interface Converter {
    String asString(Object object);
}

Method 2: Helper method to capture wild card by type inference

Create an helper method as below,

// Helper method created so that the wildcard can be captured
// through type inference.
private <T> void helper(List<T> data) {
    Map<Class<?>, Converter<T>> converterMap = null;
    List<String> stringData = null;

    for (T datum : data) {
        stringData.add(converterMap.get(datum.getClass()).asString(datum));
    }
}

Call this helper method as below

List<?> data = fetchData();
helper(data);

这篇关于具有无界通配符的Java泛型?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆