Eclipse正在向我发出以下形式的警告:
类型安全:从Object到HashMap的未选中转换
这是来自对我无法控制的API的调用返回Object:
HashMap<String, String> getItems(javax.servlet.http.HttpSession session) {
HashMap<String, String> theHash = (HashMap<String, String>)session.getAttribute("attributeKey");
return theHash;
}
Run Code Online (Sandbox Code Playgroud)
如果可能的话,我想避免Eclipse警告,因为理论上它们至少表明存在潜在的代码问题.但是,我还没有找到一种消除这种方法的好方法.我可以将涉及的单行提取到方法中并添加@SuppressWarnings("unchecked")到该方法,从而限制了我忽略警告的代码块的影响.有更好的选择吗?我不想在Eclipse中关闭这些警告.
在我来到代码之前,它更简单,但仍然引发了警告:
HashMap getItems(javax.servlet.http.HttpSession session) {
HashMap theHash = (HashMap)session.getAttribute("attributeKey");
return theHash;
}
Run Code Online (Sandbox Code Playgroud)
当您尝试使用哈希时,问题出在其他地方,您会收到警告:
HashMap items = getItems(session);
items.put("this", "that");
Type safety: The method put(Object, Object) belongs to the raw type HashMap. References to generic type HashMap<K,V> should be parameterized.
Run Code Online (Sandbox Code Playgroud) 我在标题中给出了警告信息.我想了解并删除它.我在这个问题上找到了一些答案,但由于技术术语过载,我不理解这些答案.用简单的词语解释这个问题有可能吗?
PS我知道OOP是什么.我知道什么是对象,类,方法,字段和实例化.
PPS如果有人需要我的代码,它在这里:
import java.awt.*;
import javax.swing.*;
public class HelloWorldSwing extends JFrame {
JTextArea m_resultArea = new JTextArea(6, 30);
//====================================================== constructor
public HelloWorldSwing() {
//... Set initial text, scrolling, and border.
m_resultArea.setText("Enter more text to see scrollbars");
JScrollPane scrollingArea = new JScrollPane(m_resultArea);
scrollingArea.setBorder(BorderFactory.createEmptyBorder(10,5,10,5));
// Get the content pane, set layout, add to center
Container content = this.getContentPane();
content.setLayout(new BorderLayout());
content.add(scrollingArea, BorderLayout.CENTER);
this.pack();
}
public static void createAndViewJFrame() {
JFrame win = new HelloWorldSwing();
win.setTitle("TextAreaDemo");
win.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
win.setVisible(true);
}
//============================================================= main
public …Run Code Online (Sandbox Code Playgroud) 我已经阅读过Neal Gafter关于这个主题的博客,但我仍然不清楚其中的一些观点.
为什么在给定Java的当前状态,JVM和现有集合API的情况下,不可能创建保留类型信息的Collections API的实现?难道这些不能以保留向后兼容性的方式替换未来Java版本中的现有实现吗?
举个例子:
List<T> list = REIList<T>(T.Class);
Run Code Online (Sandbox Code Playgroud)
REIList是这样的:
public REIList<T>() implements List {
private Object o;
private Class klass;
public REIList(Object o) {
this.o = o;
klass = o.getClass();
}
... the rest of the list implementation ...
Run Code Online (Sandbox Code Playgroud)
并且这些方法使用Object o和Class klass来获取类型信息.
为什么保留泛型类信息需要语言更改而不仅仅是JVM实现更改?
我不明白的是什么?
我有一个列出自定义对象的ListView(比方说MyObject).
我想通过动态过滤它,EditText所以我不得不getFilter()用publishResults方法实现一个:
@Override
protected void publishResults(CharSequence constraint, FilterResults results) {
MyObjectAdapter.this.setItems((List<MyObject>) results.values);
MyObjectAdapter.this.notifyDataSetChanged();
}
Run Code Online (Sandbox Code Playgroud)
此时,Eclipse抱怨道: Type safety: Unchecked cast from Object to List<MyObject>
我确信这个演员总是真实的,但Eclipse只建议添加,@SuppressWarnings("unchecked")但我完全反对,SuppressWarnings因为它只是隐藏问题,而不是解决方案......
我尝试添加:
if(results.values instanceof List<MyObject>)
Run Code Online (Sandbox Code Playgroud)
但Eclipse再次抱怨,这没有解决任何问题......
Cannot perform instanceof check against parameterized type List<MyObject>. Use the form List<?>
我知道转换将始终是正确的,但这是使代码确定results.values实际上是正确的方法List<MyObject>吗?
提前致谢!
最近我开始测试Firebase新文档db Firestore用于学习目的,我现在卡在文档内作为对象访问值存储.
我使用下面的代码来访问Privacy存储在文档中的对象,但我不知道如何访问Key - Value?例如Key - Value,对象中有3个子对,我将如何单独访问和编辑它?
DocumentReference docRef = FirebaseFirestore.getInstance().collection("Users").document("PQ8QUHno6QdPwM89DsVTItrHGWJ3");
docRef.get().addOnCompleteListener(new OnCompleteListener<DocumentSnapshot>() {
@Override
public void onComplete(@NonNull Task<DocumentSnapshot> task) {
if (task.isSuccessful()) {
DocumentSnapshot document = task.getResult();
if (document != null) {
Log.d(TAG, "DocumentSnapshot data: " + task.getResult().getData().get("privacy"));
Object meta_object = task.getResult().getData().get("privacy");
} else {
Log.d(TAG, "No such document");
}
} else {
Log.d(TAG, "get failed with ", task.getException());
}
}
});
Run Code Online (Sandbox Code Playgroud)
任何帮助表示赞赏,谢谢.
最近我在进入通用铸造问题时重构了一个通用的方法,我无法解释.最后我意识到我可以完全没有T型(只是自己内联),但我仍然很好奇为什么转换失败.我创建了这个最小的例子来说明问题.
有人能解释一下为什么转换失败并且解决方法有效吗?
public <K, T extends List<K>> void castLists(List<T> list, K kForBinging) {
Map<Integer, List<T>> map = mapSizeToList(list);
// Type mismatch: cannot convert from Map<Integer,List<T>> to Map<Integer,List<List<K>>>
// Map<Integer, List<List<K>>> expandedMap = map;
// Added after accepting answer, legal assignment:
Map<Integer, ? extends List<? extends List<K>>> expandedMap = map;
// Originally proposed 'work around'
Map<Integer, ?> lessSpecific = map;
@SuppressWarnings("unchecked")
Map<Integer, List<List<K>>> canCast = (Map<Integer, List<List<K>>>)lessSpecific;
// ...
}
public <A> Map<Integer, List<A>> mapSizeToList(List<A> list) {
Map<Integer, List<A>> map = …Run Code Online (Sandbox Code Playgroud) 我想知道为什么以下发出关于不安全/未检查操作的警告:
Map<String, ProxySession> sessionMap = (Map<String, ProxySession>) se.getSession().getServletContext().getAttribute("myattribute");
Run Code Online (Sandbox Code Playgroud)
演员错了吗?我无法理解我在这里缺少的东西.
PS我不想摆脱警告,我想了解不安全的操作.
谢谢!
分配值而不使用通常的表示法,例如"this.<Double> getAnything(int flag)"
private <T> T getAnything(int flag) {
Object o = null;
if (flag==0)
o=new String("NewString");
else if (flag==1)
o=new Double(0D);
return (T)o;
}
private void someMethod() {
String s = getAnything(0);
Double d = getAnything(1);
}
Run Code Online (Sandbox Code Playgroud)
在过去,只有方法上的返回对象和接收类型上的简单强制转换就足够了,因此在接收器对象上缺少通用符号,它更加相似和快速写入,还有其他任何提示吗?
这是示例代码:
public static BaseListAdapter<? extends Item> getListAdapter() {
...
}
...
public class MyClass<T extends Item> {
...
BaseListAdapter<T> adapter = (BaseListAdapter<T>) getListAdapter();
...
}
Run Code Online (Sandbox Code Playgroud)
编译器抱怨有一个未经检查的强制转换.
java: unchecked cast
need: BaseListAdapter<T>
found: BaseListAdapter<capture#1, ? extends Item>
Run Code Online (Sandbox Code Playgroud)
我想知道为什么会产生这个警告以及如何解决它.
deviceId我使用下面的代码从 Spring Authentication 类中提取。
import org.springframework.security.core.Authentication;
import org.springframework.security.core.context.SecurityContextHolder;
import com.google.common.base.Optional;
public static Optional<String> getId() {
Authentication auth = SecurityContextHolder.getContext().getAuthentication();
if (!auth.isAuthenticated()) {
return Optional.absent();
}
// I see a warning as "Type safety: Unchecked cast from Object to Map<String,String>"
Map<String, String> details = (Map<String, String>) auth.getDetails();
return Optional.of(details.get("deviceId"));
}
Run Code Online (Sandbox Code Playgroud)
如何克服此类型安全警告消息?我想避免添加Suprress Warnings标签。
类型安全:未经检查的强制转换从
Object到Map<String,String>
我试图模拟一个通用接口,每当我模拟它,我得到这个警告:
GenericInterface类型的表达式需要未经检查的转换以符合GenericInterface <String>
我的界面是
interface GenericInterface<T>{
public T get();
}
Run Code Online (Sandbox Code Playgroud)
我的考试是
@Test
public void testGenericMethod(){
GenericInterface<String> mockedInterface = EasyMock.createMock(GenericInterface.class);
}
Run Code Online (Sandbox Code Playgroud)
我在测试用例的第一行收到警告.
如何删除此通用警告?
java ×9
generics ×6
android ×2
autoboxing ×1
casting ×1
collections ×1
dictionary ×1
easymock ×1
filter ×1
firebase ×1
jvm ×1
listview ×1
reification ×1
serializable ×1
unchecked ×1
unsafe ×1
warnings ×1