Nax*_*s84 10 java type-mismatch java-8
我有以下类使用以下方法.
public class MyClass {
public static <T> T getSomeThing(final int id, final java.lang.reflect.Type type, final Map<Integer, String> someThings) {
final String aThing = someThings.get(id);
if (aThing == null || aThing.isEmpty()) {
return null;
}
return GsonHelper.GSON.fromJson(aThing, type);
}
}
Run Code Online (Sandbox Code Playgroud)
GsonHelper为我提供了一些帮助 com.google.gson.GsonBuilder
public class GsonHelper {
public static final com.google.gson.Gson GSON = getGsonBuilder().create();
public static GsonBuilder getGsonBuilder() {
return new GsonBuilder().setPrettyPrinting()
.enableComplexMapKeySerialization()
.registerTypeAdapter(new com.google.gson.reflect.TypeToken.TypeToken<byte[]>() {
// no body
}.getType(), new Base64TypeAdapter())
.registerTypeHierarchyAdapter(Date.class, new DateTypeAdapter())
.registerTypeHierarchyAdapter(Pattern.class, new PatternTypeAdapter())
.registerTypeAdapterFactory(new ListTypeAdapterFactory())
.registerTypeAdapterFactory(new MapTypeAdapterFactory())
.registerTypeAdapterFactory(new SetTypeAdapterFactory());
}
}
Run Code Online (Sandbox Code Playgroud)
在Java 7之前,我使用的方法如下:
Map<Integer, String> allThings = new HashMap<>();
//FILL allThings with values
if(MyClass.getSomeThing(7, java.lang.Boolean.class, allThings)){
//do something
}
Run Code Online (Sandbox Code Playgroud)
这很好.因为该方法将返回一个布尔值,我可以在"if"里面使用它.但是当我改为Java 8时,这是不可能的.编译器抱怨:
类型不匹配:无法从Object转换为boolean
//while this is working but would throw a JsonSyntaxException
final String myString = "myInvalidJsonString";
if(GsonHelper.GSON.fromJson(myString, java.lang.Boolean.class)){
//do something
}
Run Code Online (Sandbox Code Playgroud)
我知道java.lang.Boolean可以为null.我可以用以下方法解决这个问题:
final Boolean b = MyClass.getSomeThing(7, java.lang.Boolean.class, allThings);
if(b){
//do something
}
Run Code Online (Sandbox Code Playgroud)
但我很好奇为什么这个用Java 7而不是Java 8.(没有回答)
他们改变了什么?(未回答)
更改为Java 8时出现此编译器错误的原因是什么?(回答)
您的方法public static <T> T getSomeThing(final int id, final java.lang.reflect.Type t, final Map<Integer, String> someThings)不保证返回Boolean.它返回T由调用者定义的,可以是任何东西,这意味着Object.
该if语句无法知道哪种类型T都会有,因此不能保证将其转换为一个布尔值.
为什么不将签名更改为布尔值?
public static boolean getSomeThing(final int id,
final java.lang.reflect.Type t,
final Map<Integer, String> someThings)
Run Code Online (Sandbox Code Playgroud)
或者你在寻找这个?
public static <T> T getSomeThing(final int id,
final Class<T> clazz,
final Map<Integer, String> someThings)
Run Code Online (Sandbox Code Playgroud)
比这段代码编译和工作:
public static void main(String[] args) {
if (getSomeThing(7, Boolean.class, emptyMap())) {
System.out.println("It works!");
}
}
public static <T> T getSomeThing(final int id,
final Class<T> clazz,
final Map<Integer, String> someThings) {
...
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1763 次 |
| 最近记录: |