在这个例子中
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?这不是数据完整性问题吗?
更新
下面的答案和这个答案有帮助.谢谢.
例如,我们有一些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) 我们的想法是定义一个可以调用在开发类中定义的方法的基类,但是在创建时我要确保这样的方法完全根据需求定义,即方法只接受一个参数,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) 可能重复:
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) 我从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 .
我已经声明了一个方法,其参数是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?有没有办法只允许一种类型的子类型作为参数传递,而不允许非参数化的参数呢?
我想知道如何获得使用泛型时程序员编写的运行时类型。例如,如果我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)
我只能理解边界类(而不是运行时类)。
希望在了解通用边界之后,我尝试了解通配符上限和下限。我的参考是: 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) 我希望能够在运行时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类型?
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 ×10
generics ×8
arraylist ×2
types ×2
android ×1
collections ×1
inheritance ×1
methods ×1
reflection ×1
type-erasure ×1
wildcard ×1