相关疑难解决方法(0)

如何处理未经检查的投射警告?

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)

java generics warnings

583
推荐指数
12
解决办法
42万
查看次数

它是什么意思:serializable类没有声明一个静态的final serialVersionUID字段?

我在标题中给出了警告信息.我想了解并删除它.我在这个问题上找到了一些答案,但由于技术术语过载,我不理解这些答案.用简单的词语解释这个问题有可能吗?

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)

java serializable serialversionuid

208
推荐指数
5
解决办法
20万
查看次数

什么是Reified Generics?他们如何解决类型擦除问题以及为什么不能在没有重大变化的情况下添加它们?

我已经阅读过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实现更改?

我不明白的是什么?

java generics collections jvm reification

68
推荐指数
3
解决办法
3万
查看次数

类型安全:未选中从对象转换为列表<MyObject>

我有一个列出自定义对象的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>吗?

提前致谢!

android listview casting filter custom-object

19
推荐指数
3
解决办法
4万
查看次数

在Firestore数据库中访问存储为Object的数据

数据库结构

最近我开始测试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)

任何帮助表示赞赏,谢谢.

android firebase google-cloud-firestore

7
推荐指数
1
解决办法
6568
查看次数

无法将泛型转换为扩展嵌套类型

最近我在进入通用铸造问题时重构了一个通用的方法,我无法解释.最后我意识到我可以完全没有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)

java generics

6
推荐指数
1
解决办法
173
查看次数

Java未经检查的操作转换为泛型

我想知道为什么以下发出关于不安全/未检查操作的警告:

Map<String, ProxySession> sessionMap = (Map<String, ProxySession>) se.getSession().getServletContext().getAttribute("myattribute");
Run Code Online (Sandbox Code Playgroud)

演员错了吗?我无法理解我在这里缺少的东西.

PS我不想摆脱警告,我想了解不安全的操作.

谢谢!

java generics unsafe unchecked

4
推荐指数
1
解决办法
1049
查看次数

这是通用的自动装箱吗?

分配值而不使用通常的表示法,例如"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)

在过去,只有方法上的返回对象和接收类型上的简单强制转换就足够了,因此在接收器对象上缺少通用符号,它更加相似和快速写入,还有其他任何提示吗?

java generics autoboxing

3
推荐指数
1
解决办法
676
查看次数

Java泛型类型转换

这是示例代码:

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)

我想知道为什么会产生这个警告以及如何解决它.

java

3
推荐指数
1
解决办法
150
查看次数

如何摆脱“类型安全:从对象到 Map&lt;String,String&gt; 的未经检查的转换”

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标签。

类型安全:未经检查的强制转换从ObjectMap<String,String>

java dictionary spring-security

3
推荐指数
1
解决办法
9195
查看次数

如何摆脱这种泛型警告?

我试图模拟一个通用接口,每当我模拟它,我得到这个警告:

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 generics easymock

2
推荐指数
1
解决办法
3441
查看次数