相关疑难解决方法(0)

原始类型和数据完整性列表

在这个例子中

public static void main(String[] args) {

    List<Integer> integers = new ArrayList<Integer>();
    integers.add(1);
    addToList(integers);
    System.out.println(integers);
}


public static void addToList(List list0){
    list0.add("blabl");
}
Run Code Online (Sandbox Code Playgroud)

这将编译并打印结果

[1,blabl]

我的理解是:

引用变量'integers'具有arraylist对象的地址(比如111),该地址被传递给addToList方法.因此在addToList方法中,list0指向具有该对象的同一地址(它是Integer类型的arraylist),并且将一个字符串添加到此arraylist对象中.

如何将String添加到Integer类型的arraylist?这不是数据完整性问题吗?

更新

下面的答案和这个答案有帮助.谢谢.

java generics arraylist

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

集合成为原始类型

例如,我们有一些AbsractClass

package inherit;

import java.util.HashSet;
import java.util.Set;

/**
 * TODO: Add comment
 *
 * @author Ruslan Ibragimov
 */
public abstract class AbstractClass<T extends Integer> {

    private Set<String> strings = new HashSet<>();

    private T value;

    public Set<String> getStrings() {
        return strings;
    }

    public void setStrings(Set<String> strings) {
        this.strings = strings;
    }

    public void addString(String string) {
        strings.add(string);
    }

    public T getValue() {
        return value;
    }

    public void setValue(T value) {
        this.value = value;
    }
}
Run Code Online (Sandbox Code Playgroud)

还有一些孩子:

package inherit;

/**
 * TODO: …
Run Code Online (Sandbox Code Playgroud)

java generics inheritance

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

Java:如何检查泛型类的定义?

我们的想法是定义一个可以调用在开发类中定义的方法的基类,但是在创建时我要确保这样的方法完全根据需求定义,即方法只接受一个参数,HashMap <String String> .

到目前为止,我能够使用以下代码检查该方法是否只包含一个参数,并且它是Class HashMap,但是如何检查通用定义是<String, String>?

public boolean isMethodParameterValid(final Method method) {
  final Class<?>[] parameters = method.getParameterTypes();
  return ((parameters.length == 1) && parameters[0].isAssignableFrom(HashMap.class));
}
Run Code Online (Sandbox Code Playgroud)

java generics types

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

原始类型和泛型 - Java

可能重复:
List <Dog>是List <Animal>的子类吗?为什么Java的泛型不是隐式多态的?
Java Generics - 将子类列表分配给超类列表

使用原始类型,您可以轻松地说出类似的内容.

[...] // MyClass is generic with upper bound of Object

MyClass c = new MyClass<Double>();

[...]
Run Code Online (Sandbox Code Playgroud)

但这是不允许的

MyClass<Number> c = new MyClass<Double>() 
Run Code Online (Sandbox Code Playgroud)

我不明白为什么会这样.我的书告诉我为什么第二个不起作用,因为你不能添加一个整数MyClass<Double>.它没有解释的是为什么MyClass<Double>MyClass<Object>(或等效的原始类型形式)的子类,因为double是object的子类.

那么,如果第二种形式不是第一种,为什么第一种允许.请意识到我是新手.

编辑:如果Number是上限,那么在第一个例子中会发生什么呢?

你可以在这里看到类型擦除的影响

class Untitled {
public static void main(String[] args) {

}
public static<T> void c(T t)
{
    t.SubClassMethod();// this won't work because class Object has no such method. But if I change the upperbound to SubClass it will.
            t.toString() // …
Run Code Online (Sandbox Code Playgroud)

java generics

5
推荐指数
1
解决办法
470
查看次数

如何在instanceof之后返回true时使用ClassCastException

我从Android的Pair.java获取以下代码片段

public boolean equals(Object o) {
    if (o == this) return true;
    if (!(o instanceof Pair)) return false;
    final Pair<F, S> other;
    try {
        other = (Pair<F, S>) o;
    } catch (ClassCastException e) {
        return false;
    }
    return first.equals(other.first) && second.equals(other.second);
}
Run Code Online (Sandbox Code Playgroud)

我想知道,在instanceof返回true 之后,怎么可能有ClassCastException .

java android

5
推荐指数
1
解决办法
1372
查看次数

在方法参数中使用通配符

我已经声明了一个方法,其参数是Number下面给出的子类型:

public static void organizeData(java.util.List<? extends Number> c) {
    //operation on the list
}
Run Code Online (Sandbox Code Playgroud)

我可以将任何非参数化列表作为参数传递.那么使用通配符有<? extends Number>什么意义呢?

List newList = new LinkedList<>();
ClassName.organizeData(newList);
Run Code Online (Sandbox Code Playgroud)

为什么我Object要从中获取类型元素c?而不是类型Number?有没有办法只允许一种类型的子类型作为参数传递,而不允许非参数化的参数呢?

java generics collections wildcard

5
推荐指数
1
解决办法
1134
查看次数

使用泛型时Java反射获取运行时类型

我想知道如何获得使用泛型时程序员编写的运行时类型。例如,如果我class Main<T extends List<String>>和程序员写了类似的东西

Main<ArrayList<String>> main = new Main<>();
Run Code Online (Sandbox Code Playgroud)

我如何通过反射来了解使用了哪个类扩展List<String>

我很好奇我怎么能做到这一点。用

main.getClass().getTypeParameters()[0].getBounds[] 
Run Code Online (Sandbox Code Playgroud)

我只能理解边界类(而不是运行时类)。

java generics reflection

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

java 类型擦除如何处理 '?'

希望在了解通用边界之后,我尝试了解通配符上限和下限。我的参考是: https: //docs.oracle.com/javase/tutorial/java/generics/wildcards.html 我发现有一句话我能理解:“通配符可以在多种情况下使用:作为参数、字段或局部变量; “字段和局部变量?无法想象。为什么如此重要的来源不通过一个简单的例子来强调它?

我试图了解 java 编译器用哪个引用来替换(同时擦除)“?”。也许我有一个很大的误解,并且会发生任何删除(因此以下所有示例都不相关)。在下面的例子中: 1.

public static void funcA (List<? extends Number>l)
Run Code Online (Sandbox Code Playgroud)

2.

public static void funcB(List<? super Integer>l)
Run Code Online (Sandbox Code Playgroud)

第二个示例和以下代码之间有区别吗: 3.

public static <T extends Integer> funcC(List<? extends T>l)
Run Code Online (Sandbox Code Playgroud)

示例2与下面的示例是否有不同: 4.

public static <T extends Integer> void funcC(List<T>l)
Run Code Online (Sandbox Code Playgroud)

java generics type-erasure

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

Java中的通用方法,确定类型

我希望能够在运行时detirmine我的方法调用的返回类型,但我似乎无法获得T的类型.

    public <T> T getT()
    {
        Object t = null;
        Class<?> c = t.getClass();
        System.out.println(c.getName());
        return (T) t;
    }
Run Code Online (Sandbox Code Playgroud)

有没有办法在Java中确定运行时的T类型?

java generics methods types

0
推荐指数
1
解决办法
6047
查看次数

Java版本中的ArrayList修改为什么?

ArrayList声明从java版本1 修改为另一个ArrayList.修改声明的优点是什么.

例如:这里我提到了各种版本的Java支持的三种声明.我在Eclipse中设置了Java Compilance leve 1.4

 ArrayList val=new ArrayList();//Supported at 1.4  
 ArrayList<String> val=new ArrayList<String>();//Syntax error, parameterized types are only available if source level is 1.5 or greater 
 ArrayList<String> val=new ArrayList< >();//operator is not allowed for source level below 1.7
Run Code Online (Sandbox Code Playgroud)

java arraylist

0
推荐指数
1
解决办法
561
查看次数