diff --git a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/unary/CastComplexNode.java b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/unary/CastComplexNode.java
index dc6bab1f9142ce475c6ab6efb1bcb5504b9a4562..ac113eb0c847abb0ebd0b80aaeab2511bff714da 100644
--- a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/unary/CastComplexNode.java
+++ b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/unary/CastComplexNode.java
@@ -36,15 +36,16 @@ import com.oracle.truffle.r.runtime.data.RComplex;
 import com.oracle.truffle.r.runtime.data.RComplexVector;
 import com.oracle.truffle.r.runtime.data.RDataFactory;
 import com.oracle.truffle.r.runtime.data.RList;
-import com.oracle.truffle.r.runtime.data.RLogicalVector;
 import com.oracle.truffle.r.runtime.data.RMissing;
 import com.oracle.truffle.r.runtime.data.RNull;
 import com.oracle.truffle.r.runtime.data.RRaw;
-import com.oracle.truffle.r.runtime.data.RRawVector;
-import com.oracle.truffle.r.runtime.data.RStringVector;
+import com.oracle.truffle.r.runtime.data.model.RAbstractComplexVector;
 import com.oracle.truffle.r.runtime.data.model.RAbstractDoubleVector;
 import com.oracle.truffle.r.runtime.data.model.RAbstractIntVector;
 import com.oracle.truffle.r.runtime.data.model.RAbstractListVector;
+import com.oracle.truffle.r.runtime.data.model.RAbstractLogicalVector;
+import com.oracle.truffle.r.runtime.data.model.RAbstractRawVector;
+import com.oracle.truffle.r.runtime.data.model.RAbstractStringVector;
 import com.oracle.truffle.r.runtime.data.model.RAbstractVector;
 import com.oracle.truffle.r.runtime.ops.na.NACheck;
 import com.oracle.truffle.r.runtime.ops.na.NAProfile;
@@ -168,12 +169,12 @@ public abstract class CastComplexNode extends CastBaseNode {
     }
 
     @Specialization
-    protected RComplexVector doLogicalVector(RLogicalVector operand) {
+    protected RComplexVector doLogicalVector(RAbstractLogicalVector operand) {
         return createResultVector(operand, index -> naCheck.convertLogicalToComplex(operand.getDataAt(index)));
     }
 
     @Specialization
-    protected RComplexVector doStringVector(RStringVector operand,
+    protected RComplexVector doStringVector(RAbstractStringVector operand,
                     @Cached("createBinaryProfile()") ConditionProfile emptyStringProfile) {
         naCheck.enable(operand);
         double[] ddata = new double[operand.getLength() << 1];
@@ -211,12 +212,12 @@ public abstract class CastComplexNode extends CastBaseNode {
     }
 
     @Specialization
-    protected RComplexVector doComplexVector(RComplexVector vector) {
+    protected RAbstractComplexVector doComplexVector(RAbstractComplexVector vector) {
         return vector;
     }
 
     @Specialization
-    protected RComplexVector doRawVector(RRawVector operand) {
+    protected RComplexVector doRawVector(RAbstractRawVector operand) {
         return createResultVector(operand, index -> RDataFactory.createComplex(operand.getRawDataAt(index), 0));
     }
 
diff --git a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/unary/CastDoubleNode.java b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/unary/CastDoubleNode.java
index ef5078d262fe5c861850108a366bd2f55e6c0f4b..f0dd71f992271cb472a238e484f40d7e127382ae 100644
--- a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/unary/CastDoubleNode.java
+++ b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/unary/CastDoubleNode.java
@@ -36,17 +36,17 @@ import com.oracle.truffle.r.runtime.RError;
 import com.oracle.truffle.r.runtime.RRuntime;
 import com.oracle.truffle.r.runtime.RType;
 import com.oracle.truffle.r.runtime.data.RComplex;
-import com.oracle.truffle.r.runtime.data.RComplexVector;
 import com.oracle.truffle.r.runtime.data.RDataFactory;
 import com.oracle.truffle.r.runtime.data.RDoubleVector;
 import com.oracle.truffle.r.runtime.data.RList;
-import com.oracle.truffle.r.runtime.data.RStringVector;
+import com.oracle.truffle.r.runtime.data.model.RAbstractComplexVector;
 import com.oracle.truffle.r.runtime.data.model.RAbstractContainer;
 import com.oracle.truffle.r.runtime.data.model.RAbstractDoubleVector;
 import com.oracle.truffle.r.runtime.data.model.RAbstractIntVector;
 import com.oracle.truffle.r.runtime.data.model.RAbstractListVector;
 import com.oracle.truffle.r.runtime.data.model.RAbstractLogicalVector;
 import com.oracle.truffle.r.runtime.data.model.RAbstractRawVector;
+import com.oracle.truffle.r.runtime.data.model.RAbstractStringVector;
 import com.oracle.truffle.r.runtime.data.model.RAbstractVector;
 import com.oracle.truffle.r.runtime.interop.ForeignArray2R;
 
@@ -123,7 +123,7 @@ public abstract class CastDoubleNode extends CastDoubleBaseNode {
     }
 
     @Specialization
-    protected RDoubleVector doStringVector(RStringVector operand,
+    protected RDoubleVector doStringVector(RAbstractStringVector operand,
                     @Cached("createBinaryProfile()") ConditionProfile emptyStringProfile,
                     @Cached("create()") BranchProfile warningBranch) {
         naCheck.enable(operand);
@@ -160,7 +160,7 @@ public abstract class CastDoubleNode extends CastDoubleBaseNode {
     }
 
     @Specialization
-    protected RDoubleVector doComplexVector(RComplexVector operand) {
+    protected RDoubleVector doComplexVector(RAbstractComplexVector operand) {
         naCheck.enable(operand);
         double[] ddata = new double[operand.getLength()];
         boolean warning = false;
@@ -223,16 +223,16 @@ public abstract class CastDoubleNode extends CastDoubleBaseNode {
     }
 
     @Specialization(guards = "isForeignObject(obj)")
-    protected RDoubleVector doForeignObject(TruffleObject obj,
+    protected RAbstractDoubleVector doForeignObject(TruffleObject obj,
                     @Cached("create()") ForeignArray2R foreignArray2R) {
         Object o = foreignArray2R.convert(obj);
         if (!RRuntime.isForeignObject(o)) {
-            if (o instanceof RDoubleVector) {
-                return (RDoubleVector) o;
+            if (o instanceof RAbstractDoubleVector) {
+                return (RAbstractDoubleVector) o;
             }
             o = castDoubleRecursive(o);
-            if (o instanceof RDoubleVector) {
-                return (RDoubleVector) o;
+            if (o instanceof RAbstractDoubleVector) {
+                return (RAbstractDoubleVector) o;
             }
         }
         throw error(RError.Message.CANNOT_COERCE_EXTERNAL_OBJECT_TO_VECTOR, "vector");
diff --git a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/unary/CastIntegerNode.java b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/unary/CastIntegerNode.java
index 940f8c673b9682366058a3a879260542be90f4ae..558b86015a62ecafe6edd553d551a195b6c51108 100644
--- a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/unary/CastIntegerNode.java
+++ b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/unary/CastIntegerNode.java
@@ -231,16 +231,16 @@ public abstract class CastIntegerNode extends CastIntegerBaseNode {
     }
 
     @Specialization(guards = "isForeignObject(obj)")
-    protected RIntVector doForeignObject(TruffleObject obj,
+    protected RAbstractIntVector doForeignObject(TruffleObject obj,
                     @Cached("create()") ForeignArray2R foreignArray2R) {
         Object o = foreignArray2R.convert(obj);
         if (!RRuntime.isForeignObject(o)) {
-            if (o instanceof RIntVector) {
-                return (RIntVector) o;
+            if (o instanceof RAbstractIntVector) {
+                return (RAbstractIntVector) o;
             }
             o = castIntegerRecursive(o);
-            if (o instanceof RIntVector) {
-                return (RIntVector) o;
+            if (o instanceof RAbstractIntVector) {
+                return (RAbstractIntVector) o;
             }
         }
         throw error(RError.Message.CANNOT_COERCE_EXTERNAL_OBJECT_TO_VECTOR, "vector");
diff --git a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/unary/CastLogicalNode.java b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/unary/CastLogicalNode.java
index 1d734075f147b55cb99371fe8d2405b1568f6870..17b784f1b10aa500aa9c300a8a0273c31ef53a35 100644
--- a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/unary/CastLogicalNode.java
+++ b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/unary/CastLogicalNode.java
@@ -32,17 +32,18 @@ import com.oracle.truffle.api.interop.TruffleObject;
 import com.oracle.truffle.r.nodes.helpers.InheritsCheckNode;
 import com.oracle.truffle.r.runtime.RError;
 import com.oracle.truffle.r.runtime.RRuntime;
-import com.oracle.truffle.r.runtime.data.RComplexVector;
 import com.oracle.truffle.r.runtime.data.RDataFactory;
 import com.oracle.truffle.r.runtime.data.RList;
 import com.oracle.truffle.r.runtime.data.RLogicalVector;
 import com.oracle.truffle.r.runtime.data.RMissing;
 import com.oracle.truffle.r.runtime.data.RNull;
-import com.oracle.truffle.r.runtime.data.RRawVector;
-import com.oracle.truffle.r.runtime.data.RStringVector;
+import com.oracle.truffle.r.runtime.data.model.RAbstractComplexVector;
 import com.oracle.truffle.r.runtime.data.model.RAbstractDoubleVector;
 import com.oracle.truffle.r.runtime.data.model.RAbstractIntVector;
 import com.oracle.truffle.r.runtime.data.model.RAbstractListVector;
+import com.oracle.truffle.r.runtime.data.model.RAbstractLogicalVector;
+import com.oracle.truffle.r.runtime.data.model.RAbstractRawVector;
+import com.oracle.truffle.r.runtime.data.model.RAbstractStringVector;
 import com.oracle.truffle.r.runtime.data.model.RAbstractVector;
 import com.oracle.truffle.r.runtime.interop.ForeignArray2R;
 import com.oracle.truffle.r.runtime.ops.na.NAProfile;
@@ -111,7 +112,7 @@ public abstract class CastLogicalNode extends CastLogicalBaseNode {
     }
 
     @Specialization
-    protected RLogicalVector doLogicalVector(RLogicalVector operand) {
+    protected RAbstractLogicalVector doLogicalVector(RAbstractLogicalVector operand) {
         return operand;
     }
 
@@ -133,17 +134,17 @@ public abstract class CastLogicalNode extends CastLogicalBaseNode {
     }
 
     @Specialization
-    protected RLogicalVector doStringVector(RStringVector operand) {
+    protected RLogicalVector doStringVector(RAbstractStringVector operand) {
         return createResultVector(operand, index -> naCheck.convertStringToLogical(operand.getDataAt(index)));
     }
 
     @Specialization
-    protected RLogicalVector doComplexVector(RComplexVector operand) {
+    protected RLogicalVector doComplexVector(RAbstractComplexVector operand) {
         return createResultVector(operand, index -> naCheck.convertComplexToLogical(operand.getDataAt(index)));
     }
 
     @Specialization
-    protected RLogicalVector doRawVectorDims(RRawVector operand) {
+    protected RLogicalVector doRawVectorDims(RAbstractRawVector operand) {
         return createResultVector(operand, index -> RRuntime.raw2logical(operand.getRawDataAt(index)));
     }
 
@@ -193,16 +194,16 @@ public abstract class CastLogicalNode extends CastLogicalBaseNode {
     }
 
     @Specialization(guards = "isForeignObject(obj)")
-    protected RLogicalVector doForeignObject(TruffleObject obj,
+    protected RAbstractLogicalVector doForeignObject(TruffleObject obj,
                     @Cached("create()") ForeignArray2R foreignArray2R) {
         Object o = foreignArray2R.convert(obj);
         if (!RRuntime.isForeignObject(o)) {
-            if (o instanceof RLogicalVector) {
-                return (RLogicalVector) o;
+            if (o instanceof RAbstractLogicalVector) {
+                return (RAbstractLogicalVector) o;
             }
             o = castLogicalRecursive(o);
             if (o instanceof RLogicalVector) {
-                return (RLogicalVector) o;
+                return (RAbstractLogicalVector) o;
             }
         }
         throw error(RError.Message.CANNOT_COERCE_EXTERNAL_OBJECT_TO_VECTOR, "vector");
diff --git a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/unary/CastRawNode.java b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/unary/CastRawNode.java
index 44b0149e20f5b7a5f4ccdaa3dc216fadb01a3d16..541bb6d9a250ce1a4691b07c386a8fcb5a4c7279 100644
--- a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/unary/CastRawNode.java
+++ b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/unary/CastRawNode.java
@@ -31,17 +31,18 @@ import com.oracle.truffle.r.runtime.RError;
 import com.oracle.truffle.r.runtime.RRuntime;
 import com.oracle.truffle.r.runtime.RType;
 import com.oracle.truffle.r.runtime.data.RComplex;
-import com.oracle.truffle.r.runtime.data.RComplexVector;
 import com.oracle.truffle.r.runtime.data.RDataFactory;
-import com.oracle.truffle.r.runtime.data.RLogicalVector;
 import com.oracle.truffle.r.runtime.data.RMissing;
 import com.oracle.truffle.r.runtime.data.RNull;
 import com.oracle.truffle.r.runtime.data.RRaw;
 import com.oracle.truffle.r.runtime.data.RRawVector;
-import com.oracle.truffle.r.runtime.data.RStringVector;
+import com.oracle.truffle.r.runtime.data.model.RAbstractComplexVector;
 import com.oracle.truffle.r.runtime.data.model.RAbstractDoubleVector;
 import com.oracle.truffle.r.runtime.data.model.RAbstractIntVector;
 import com.oracle.truffle.r.runtime.data.model.RAbstractListVector;
+import com.oracle.truffle.r.runtime.data.model.RAbstractLogicalVector;
+import com.oracle.truffle.r.runtime.data.model.RAbstractRawVector;
+import com.oracle.truffle.r.runtime.data.model.RAbstractStringVector;
 import com.oracle.truffle.r.runtime.data.model.RAbstractVector;
 import com.oracle.truffle.r.runtime.ops.na.NACheck;
 import com.oracle.truffle.r.runtime.ops.na.NAProfile;
@@ -185,7 +186,7 @@ public abstract class CastRawNode extends CastBaseNode {
     }
 
     @Specialization
-    protected RRawVector doLogicalVector(RLogicalVector operand) {
+    protected RRawVector doLogicalVector(RAbstractLogicalVector operand) {
         byte[] bdata = new byte[operand.getLength()];
         boolean warning = false;
         for (int i = 0; i < operand.getLength(); i++) {
@@ -205,7 +206,7 @@ public abstract class CastRawNode extends CastBaseNode {
     }
 
     @Specialization
-    protected RRawVector doStringVector(RStringVector operand,
+    protected RRawVector doStringVector(RAbstractStringVector operand,
                     @Cached("createBinaryProfile()") ConditionProfile emptyStringProfile,
                     @Cached("create()") NAProfile naProfile) {
         naCheck.enable(operand);
@@ -245,7 +246,7 @@ public abstract class CastRawNode extends CastBaseNode {
     }
 
     @Specialization
-    protected RRawVector doComplexVector(RComplexVector operand) {
+    protected RRawVector doComplexVector(RAbstractComplexVector operand) {
         byte[] bdata = new byte[operand.getLength()];
         boolean imaginaryDiscardedWarning = false;
         boolean outOfRangeWarning = false;
@@ -294,7 +295,7 @@ public abstract class CastRawNode extends CastBaseNode {
     }
 
     @Specialization
-    protected RRawVector doRawVector(RRawVector operand) {
+    protected RAbstractRawVector doRawVector(RAbstractRawVector operand) {
         return operand;
     }
 
diff --git a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/unary/CastStringNode.java b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/unary/CastStringNode.java
index b9406a1420f983e85e9545d369f3bf3448008a30..8210498a21ccb4f7a9af213c0b3572419b7494a0 100644
--- a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/unary/CastStringNode.java
+++ b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/unary/CastStringNode.java
@@ -39,6 +39,7 @@ import com.oracle.truffle.r.runtime.data.RStringSequence;
 import com.oracle.truffle.r.runtime.data.RStringVector;
 import com.oracle.truffle.r.runtime.data.RSymbol;
 import com.oracle.truffle.r.runtime.data.model.RAbstractContainer;
+import com.oracle.truffle.r.runtime.data.model.RAbstractStringVector;
 import com.oracle.truffle.r.runtime.interop.ForeignArray2R;
 
 @ImportStatic(RRuntime.class)
@@ -76,12 +77,7 @@ public abstract class CastStringNode extends CastStringBaseNode {
     }
 
     @Specialization
-    protected RStringVector doStringVector(RStringVector vector) {
-        return vector;
-    }
-
-    @Specialization
-    protected RStringSequence doStringSequence(RStringSequence vector) {
+    protected RAbstractStringVector doStringVector(RAbstractStringVector vector) {
         return vector;
     }
 
@@ -90,7 +86,7 @@ public abstract class CastStringNode extends CastStringBaseNode {
         return RDataFactory.createStringSequence("", "", vector.getStart(), vector.getStride(), vector.getLength());
     }
 
-    @Specialization(guards = "!isIntSequence(operandIn)")
+    @Specialization(guards = {"!isIntSequence(operandIn)", "!isRAbstractStringVector(operandIn)"})
     protected RStringVector doAbstractContainer(RAbstractContainer operandIn,
                     @Cached("createClassProfile()") ValueProfile operandProfile,
                     @Cached("createBinaryProfile()") ConditionProfile isLanguageProfile) {
@@ -109,16 +105,16 @@ public abstract class CastStringNode extends CastStringBaseNode {
     }
 
     @Specialization(guards = "isForeignObject(obj)")
-    protected RStringVector doForeignObject(TruffleObject obj,
+    protected RAbstractStringVector doForeignObject(TruffleObject obj,
                     @Cached("create()") ForeignArray2R foreignArray2R) {
         Object o = foreignArray2R.convert(obj);
         if (!RRuntime.isForeignObject(o)) {
-            if (o instanceof RStringVector) {
-                return (RStringVector) o;
+            if (o instanceof RAbstractStringVector) {
+                return (RAbstractStringVector) o;
             }
             o = castStringRecursive(o);
-            if (o instanceof RStringVector) {
-                return (RStringVector) o;
+            if (o instanceof RAbstractStringVector) {
+                return (RAbstractStringVector) o;
             }
         }
         throw error(RError.Message.CANNOT_COERCE_EXTERNAL_OBJECT_TO_VECTOR, "vector");
diff --git a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/unary/CastSymbolNode.java b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/unary/CastSymbolNode.java
index 6f2ac0b11545308c569f3c75100fe53711471cc0..b5118c475f6dfa08389c85de58cb8a28559dd8f0 100644
--- a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/unary/CastSymbolNode.java
+++ b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/unary/CastSymbolNode.java
@@ -33,13 +33,9 @@ import com.oracle.truffle.r.runtime.RInternalError;
 import com.oracle.truffle.r.runtime.RType;
 import com.oracle.truffle.r.runtime.data.RComplex;
 import com.oracle.truffle.r.runtime.data.RDataFactory;
-import com.oracle.truffle.r.runtime.data.RDoubleVector;
-import com.oracle.truffle.r.runtime.data.RIntVector;
 import com.oracle.truffle.r.runtime.data.RList;
-import com.oracle.truffle.r.runtime.data.RLogicalVector;
 import com.oracle.truffle.r.runtime.data.RNull;
 import com.oracle.truffle.r.runtime.data.RRaw;
-import com.oracle.truffle.r.runtime.data.RStringVector;
 import com.oracle.truffle.r.runtime.data.RSymbol;
 import com.oracle.truffle.r.runtime.data.model.RAbstractAtomicVector;
 import com.oracle.truffle.r.runtime.data.model.RAbstractVector;
diff --git a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/unary/ConvertBooleanNode.java b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/unary/ConvertBooleanNode.java
index 0541c5523b79038b7dbd6c335f7e281640464bd9..2a75ee21d7cae46891d7614233774f9b64700679 100644
--- a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/unary/ConvertBooleanNode.java
+++ b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/unary/ConvertBooleanNode.java
@@ -32,14 +32,11 @@ import com.oracle.truffle.api.frame.VirtualFrame;
 import com.oracle.truffle.api.interop.TruffleObject;
 import com.oracle.truffle.api.profiles.BranchProfile;
 import com.oracle.truffle.r.runtime.RError;
-import com.oracle.truffle.r.runtime.RInternalError;
 import com.oracle.truffle.r.runtime.RRuntime;
 import com.oracle.truffle.r.runtime.data.RComplex;
 import com.oracle.truffle.r.runtime.data.RLogical;
 import com.oracle.truffle.r.runtime.data.RNull;
 import com.oracle.truffle.r.runtime.data.RRaw;
-import com.oracle.truffle.r.runtime.data.model.RAbstractAtomicVector;
-import com.oracle.truffle.r.runtime.data.model.RAbstractListVector;
 import com.oracle.truffle.r.runtime.data.model.RAbstractVector;
 import com.oracle.truffle.r.runtime.data.nodes.VectorAccess;
 import com.oracle.truffle.r.runtime.data.nodes.VectorAccess.SequentialIterator;
diff --git a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/unary/PrecedenceNode.java b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/unary/PrecedenceNode.java
index 56dc34d4db19974a05fd5699b85fae7d41d12076..12dd537fa27f2ddbc65cb756e78e49948a3bee82 100644
--- a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/unary/PrecedenceNode.java
+++ b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/unary/PrecedenceNode.java
@@ -40,32 +40,21 @@ import com.oracle.truffle.r.runtime.RError;
 import com.oracle.truffle.r.runtime.RInternalError;
 import com.oracle.truffle.r.runtime.RRuntime;
 import com.oracle.truffle.r.runtime.data.RArgsValuesAndNames;
-import com.oracle.truffle.r.runtime.data.RComplex;
-import com.oracle.truffle.r.runtime.data.RComplexVector;
-import com.oracle.truffle.r.runtime.data.RDoubleSequence;
-import com.oracle.truffle.r.runtime.data.RDoubleVector;
 import com.oracle.truffle.r.runtime.data.RExpression;
+import com.oracle.truffle.r.runtime.data.RForeignListWrapper;
 import com.oracle.truffle.r.runtime.data.RFunction;
-import com.oracle.truffle.r.runtime.data.RIntSequence;
-import com.oracle.truffle.r.runtime.data.RIntVector;
 import com.oracle.truffle.r.runtime.data.RInteropScalar;
 import com.oracle.truffle.r.runtime.data.RLanguage;
 import com.oracle.truffle.r.runtime.data.RList;
-import com.oracle.truffle.r.runtime.data.RLogical;
-import com.oracle.truffle.r.runtime.data.RLogicalVector;
 import com.oracle.truffle.r.runtime.data.RNull;
 import com.oracle.truffle.r.runtime.data.RPairList;
-import com.oracle.truffle.r.runtime.data.RRaw;
-import com.oracle.truffle.r.runtime.data.RRawVector;
 import com.oracle.truffle.r.runtime.data.RS4Object;
-import com.oracle.truffle.r.runtime.data.RString;
-import com.oracle.truffle.r.runtime.data.RStringSequence;
-import com.oracle.truffle.r.runtime.data.RStringVector;
 import com.oracle.truffle.r.runtime.data.RSymbol;
 import com.oracle.truffle.r.runtime.data.model.RAbstractAtomicVector;
 import com.oracle.truffle.r.runtime.data.model.RAbstractComplexVector;
 import com.oracle.truffle.r.runtime.data.model.RAbstractDoubleVector;
 import com.oracle.truffle.r.runtime.data.model.RAbstractIntVector;
+import com.oracle.truffle.r.runtime.data.model.RAbstractListVector;
 import com.oracle.truffle.r.runtime.data.model.RAbstractLogicalVector;
 import com.oracle.truffle.r.runtime.data.model.RAbstractRawVector;
 import com.oracle.truffle.r.runtime.data.model.RAbstractStringVector;
@@ -170,6 +159,16 @@ public abstract class PrecedenceNode extends RBaseNode {
     @Specialization(guards = "recursive")
     protected int doListRecursive(RList val, boolean recursive,
                     @Cached("createRecursive()") PrecedenceNode precedenceNode) {
+        return doListRecursiveInternal(val, precedenceNode, recursive);
+    }
+
+    @Specialization(guards = "recursive")
+    protected int doListRecursive(RForeignListWrapper val, boolean recursive,
+                    @Cached("createRecursive()") PrecedenceNode precedenceNode) {
+        return doListRecursiveInternal(val, precedenceNode, recursive);
+    }
+
+    private int doListRecursiveInternal(RAbstractListVector val, PrecedenceNode precedenceNode, boolean recursive) {
         int precedence = -1;
         for (int i = 0; i < val.getLength(); i++) {
             precedence = Math.max(precedence, precedenceNode.executeInteger(val.getDataAt(i), recursive));
@@ -197,6 +196,12 @@ public abstract class PrecedenceNode extends RBaseNode {
         return LIST_PRECEDENCE;
     }
 
+    @Specialization(guards = "!recursive")
+    @SuppressWarnings("unused")
+    protected int doList(RForeignListWrapper val, boolean recursive) {
+        return LIST_PRECEDENCE;
+    }
+
     @Specialization(guards = "!recursive")
     @SuppressWarnings("unused")
     protected int doPairList(RPairList val, boolean recursive) {
diff --git a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/unary/UnaryArithmeticReduceNode.java b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/unary/UnaryArithmeticReduceNode.java
index 7230d7b17e60bd571680b3792d0dc235d8562e0c..aa040654c312bf5aa981c0cdd1f243a10227ec25 100644
--- a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/unary/UnaryArithmeticReduceNode.java
+++ b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/unary/UnaryArithmeticReduceNode.java
@@ -35,13 +35,13 @@ import com.oracle.truffle.r.runtime.RError;
 import com.oracle.truffle.r.runtime.RInternalError;
 import com.oracle.truffle.r.runtime.RRuntime;
 import com.oracle.truffle.r.runtime.data.RComplex;
-import com.oracle.truffle.r.runtime.data.RComplexVector;
 import com.oracle.truffle.r.runtime.data.RNull;
-import com.oracle.truffle.r.runtime.data.RStringVector;
 import com.oracle.truffle.r.runtime.data.RTypes;
+import com.oracle.truffle.r.runtime.data.model.RAbstractComplexVector;
 import com.oracle.truffle.r.runtime.data.model.RAbstractDoubleVector;
 import com.oracle.truffle.r.runtime.data.model.RAbstractIntVector;
 import com.oracle.truffle.r.runtime.data.model.RAbstractLogicalVector;
+import com.oracle.truffle.r.runtime.data.model.RAbstractStringVector;
 import com.oracle.truffle.r.runtime.data.model.RAbstractVector;
 import com.oracle.truffle.r.runtime.data.nodes.VectorAccess;
 import com.oracle.truffle.r.runtime.interop.ForeignArray2R;
@@ -318,7 +318,7 @@ public abstract class UnaryArithmeticReduceNode extends RBaseNode {
     }
 
     @Specialization(guards = "supportComplex")
-    protected RComplex doComplexVector(RComplexVector operand, boolean naRm, @SuppressWarnings("unused") boolean finite) {
+    protected RComplex doComplexVector(RAbstractComplexVector operand, boolean naRm, @SuppressWarnings("unused") boolean finite) {
         RBaseNode.reportWork(this, operand.getLength());
         boolean profiledNaRm = naRmProfile.profile(naRm);
         RComplex result = RRuntime.double2complex(semantics.getDoubleStart());
@@ -348,7 +348,7 @@ public abstract class UnaryArithmeticReduceNode extends RBaseNode {
     // "largest" String for the implementation of max function
 
     @Specialization(guards = {"supportString", "operand.getLength() == 0"})
-    protected String doStringVectorEmpty(@SuppressWarnings("unused") RStringVector operand, @SuppressWarnings("unused") boolean naRm, @SuppressWarnings("unused") boolean finite) {
+    protected String doStringVectorEmpty(@SuppressWarnings("unused") RAbstractStringVector operand, @SuppressWarnings("unused") boolean naRm, @SuppressWarnings("unused") boolean finite) {
         if (semantics.getEmptyWarning() != null) {
             warning(semantics.emptyWarningCharacter);
         }
@@ -356,7 +356,7 @@ public abstract class UnaryArithmeticReduceNode extends RBaseNode {
     }
 
     @Specialization(guards = {"supportString", "operand.getLength() == 1"})
-    protected String doStringVectorOneElem(RStringVector operand, boolean naRm, boolean finite) {
+    protected String doStringVectorOneElem(RAbstractStringVector operand, boolean naRm, boolean finite) {
         boolean profiledNaRm = naRmProfile.profile(naRm);
         String result = operand.getDataAt(0);
         if (profiledNaRm) {
@@ -369,7 +369,7 @@ public abstract class UnaryArithmeticReduceNode extends RBaseNode {
     }
 
     @Specialization(guards = {"supportString", "operand.getLength() > 1"})
-    protected String doStringVector(RStringVector operand, boolean naRm, boolean finite) {
+    protected String doStringVector(RAbstractStringVector operand, boolean naRm, boolean finite) {
         boolean profiledNaRm = naRmProfile.profile(naRm);
         na.enable(operand);
         int offset = 0;
diff --git a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RForeignWrapper.java b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RForeignWrapper.java
index 36fece25f3205667f6fae6080373c2bb3e06e2ce..9521784271a54374386519a4189ef224c0870c90 100644
--- a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RForeignWrapper.java
+++ b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RForeignWrapper.java
@@ -32,6 +32,7 @@ import com.oracle.truffle.api.object.DynamicObject;
 import com.oracle.truffle.r.runtime.RInternalError;
 import com.oracle.truffle.r.runtime.data.model.RAbstractContainer;
 import com.oracle.truffle.r.runtime.data.model.RAbstractVector;
+import com.oracle.truffle.r.runtime.interop.ForeignArray2R;
 
 public abstract class RForeignWrapper implements RAbstractVector {
 
@@ -61,12 +62,12 @@ public abstract class RForeignWrapper implements RAbstractVector {
 
     @Override
     public final boolean isComplete() {
-        return true;
+        return false;
     }
 
     @Override
     public final void setComplete(boolean complete) {
-        // sequences are always complete
+        // we will not make any assumptions about the delegate Truffle Object
     }
 
     @Override
diff --git a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/interop/ForeignArray2R.java b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/interop/ForeignArray2R.java
index 43bffb637f5f30e311b4d1be0b663c15ddab6921..a689e54bdff5cc7a2d909f83521deb636a6679c4 100644
--- a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/interop/ForeignArray2R.java
+++ b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/interop/ForeignArray2R.java
@@ -99,45 +99,43 @@ public abstract class ForeignArray2R extends RBaseNode {
      *
      */
     public Object convert(Object obj, boolean recursive) {
-        if (FastROptions.ForeignObjectWrappers.getBooleanValue()) {
-            if (isForeignArray(obj)) {
-                TruffleObject truffleObject = (TruffleObject) obj;
-                try {
-                    int size = (int) ForeignAccess.sendGetSize(getSize, truffleObject);
-                    if (size == 0) {
-                        return new RForeignListWrapper(truffleObject);
-                    } else {
-                        Object firstElement = ForeignAccess.sendRead(read, truffleObject, 0);
-                        switch (InteropTypeCheck.determineType(firstElement)) {
-                            case BOOLEAN:
-                                return new RForeignBooleanWrapper(truffleObject);
-                            case DOUBLE:
-                                return new RForeignDoubleWrapper(truffleObject);
-                            case INTEGER:
-                                return new RForeignIntWrapper(truffleObject);
-                            case STRING:
-                                return new RForeignStringWrapper(truffleObject);
-                            default:
-                                return new RForeignListWrapper(truffleObject);
-                        }
+        if (FastROptions.ForeignObjectWrappers.getBooleanValue() && isForeignArray(obj)) {
+            TruffleObject truffleObject = (TruffleObject) obj;
+            try {
+                int size = (int) ForeignAccess.sendGetSize(getSize, truffleObject);
+                if (size == 0) {
+                    return new RForeignListWrapper(truffleObject);
+                } else {
+                    Object firstElement = ForeignAccess.sendRead(read, truffleObject, 0);
+                    if (isForeignArray(firstElement)) {
+                        throw error(RError.Message.GENERIC, "Wrapping of multi-dim arrays not supported.");
+                    }
+                    switch (InteropTypeCheck.determineType(firstElement)) {
+                        case BOOLEAN:
+                            return new RForeignBooleanWrapper(truffleObject);
+                        case DOUBLE:
+                            return new RForeignDoubleWrapper(truffleObject);
+                        case INTEGER:
+                            return new RForeignIntWrapper(truffleObject);
+                        case STRING:
+                            return new RForeignStringWrapper(truffleObject);
+                        default:
+                            return new RForeignListWrapper(truffleObject);
                     }
-                } catch (UnsupportedMessageException | UnknownIdentifierException e) {
-                    throw RInternalError.shouldNotReachHere(e);
                 }
-            } else {
-                return obj;
+            } catch (UnsupportedMessageException | UnknownIdentifierException e) {
+                throw RInternalError.shouldNotReachHere(e);
             }
-        } else {
-            Object result = execute(obj, recursive, null, 0);
-            if (result instanceof ForeignArrayData) {
-                ForeignArrayData arrayData = (ForeignArrayData) result;
-                if (arrayData.elements.isEmpty()) {
-                    return RDataFactory.createList();
-                }
-                return asAbstractVector(arrayData);
+        }
+        Object result = execute(obj, recursive, null, 0);
+        if (result instanceof ForeignArrayData) {
+            ForeignArrayData arrayData = (ForeignArrayData) result;
+            if (arrayData.elements.isEmpty()) {
+                return RDataFactory.createList();
             }
-            return result;
+            return asAbstractVector(arrayData);
         }
+        return result;
     }
 
     protected abstract Object execute(Object obj, boolean recursive, ForeignArrayData arrayData, int depth);
diff --git a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/ExpectedTestOutput.test b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/ExpectedTestOutput.test
index cc7e4e4fea9a0a6c3a0e75245573104b2bb8a1ae..57a4818c80ba9f64ec2ff5741afe8e9c7fda50e0 100644
--- a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/ExpectedTestOutput.test
+++ b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/ExpectedTestOutput.test
@@ -141637,6 +141637,114 @@ NULL
 [external object]
 [1] 1 2 3
 
+##com.oracle.truffle.r.test.library.fastr.TestJavaInterop.testArraysWithNullConversion#
+#if (!any(R.version$engine == "FastR")) { list('a', NULL, 'c') } else { ta <- new('com.oracle.truffle.r.test.library.fastr.TestJavaInterop$TestArraysClass');as.vector(ta$charObjectArrayWithNull) }
+[[1]]
+[1] "a"
+
+[[2]]
+NULL
+
+[[3]]
+[1] "c"
+
+
+##com.oracle.truffle.r.test.library.fastr.TestJavaInterop.testArraysWithNullConversion#
+#if (!any(R.version$engine == "FastR")) { list('a', NULL, 'c') } else { ta <- new('com.oracle.truffle.r.test.library.fastr.TestJavaInterop$TestArraysClass');as.vector(ta$stringArrayWithNull) }
+[[1]]
+[1] "a"
+
+[[2]]
+NULL
+
+[[3]]
+[1] "c"
+
+
+##com.oracle.truffle.r.test.library.fastr.TestJavaInterop.testArraysWithNullConversion#
+#if (!any(R.version$engine == "FastR")) { list(1, NULL, 3) } else { ta <- new('com.oracle.truffle.r.test.library.fastr.TestJavaInterop$TestArraysClass');as.vector(ta$byteObjectArrayWithNull) }
+[[1]]
+[1] 1
+
+[[2]]
+NULL
+
+[[3]]
+[1] 3
+
+
+##com.oracle.truffle.r.test.library.fastr.TestJavaInterop.testArraysWithNullConversion#
+#if (!any(R.version$engine == "FastR")) { list(1, NULL, 3) } else { ta <- new('com.oracle.truffle.r.test.library.fastr.TestJavaInterop$TestArraysClass');as.vector(ta$longObjectArrayWithNull) }
+[[1]]
+[1] 1
+
+[[2]]
+NULL
+
+[[3]]
+[1] 3
+
+
+##com.oracle.truffle.r.test.library.fastr.TestJavaInterop.testArraysWithNullConversion#
+#if (!any(R.version$engine == "FastR")) { list(1.1, NULL, 1.3) } else { ta <- new('com.oracle.truffle.r.test.library.fastr.TestJavaInterop$TestArraysClass');as.vector(ta$doubleObjectArrayWithNull) }
+[[1]]
+[1] 1.1
+
+[[2]]
+NULL
+
+[[3]]
+[1] 1.3
+
+
+##com.oracle.truffle.r.test.library.fastr.TestJavaInterop.testArraysWithNullConversion#
+#if (!any(R.version$engine == "FastR")) { list(1.1, NULL, 1.3) } else { ta <- new('com.oracle.truffle.r.test.library.fastr.TestJavaInterop$TestArraysClass');as.vector(ta$floatObjectArrayWithNull) }
+[[1]]
+[1] 1.1
+
+[[2]]
+NULL
+
+[[3]]
+[1] 1.3
+
+
+##com.oracle.truffle.r.test.library.fastr.TestJavaInterop.testArraysWithNullConversion#
+#if (!any(R.version$engine == "FastR")) { list(1L, NULL, 3L) } else { ta <- new('com.oracle.truffle.r.test.library.fastr.TestJavaInterop$TestArraysClass');as.vector(ta$integerObjectArrayWithNull) }
+[[1]]
+[1] 1
+
+[[2]]
+NULL
+
+[[3]]
+[1] 3
+
+
+##com.oracle.truffle.r.test.library.fastr.TestJavaInterop.testArraysWithNullConversion#
+#if (!any(R.version$engine == "FastR")) { list(1L, NULL, 3L) } else { ta <- new('com.oracle.truffle.r.test.library.fastr.TestJavaInterop$TestArraysClass');as.vector(ta$shortObjectArrayWithNull) }
+[[1]]
+[1] 1
+
+[[2]]
+NULL
+
+[[3]]
+[1] 3
+
+
+##com.oracle.truffle.r.test.library.fastr.TestJavaInterop.testArraysWithNullConversion#
+#if (!any(R.version$engine == "FastR")) { list(T, NULL, T) } else { ta <- new('com.oracle.truffle.r.test.library.fastr.TestJavaInterop$TestArraysClass');as.vector(ta$booleanObjectArrayWithNull) }
+[[1]]
+[1] TRUE
+
+[[2]]
+NULL
+
+[[3]]
+[1] TRUE
+
+
 ##com.oracle.truffle.r.test.library.fastr.TestJavaInterop.testAsList#
 #if (!any(R.version$engine == "FastR")) { 'a' } else { to <- new.external(new.java.class('com.oracle.truffle.r.test.library.fastr.TestJavaInterop$TestClass')); l<-as.list(to$arrayObject); l[[1]]$data }
 [1] "a"
diff --git a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/library/fastr/TestJavaInterop.java b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/library/fastr/TestJavaInterop.java
index 23b4808a091a254bddc3bbeec0e9e575bf1a2d05..71b89793172a4d91a5923a661260dc8bea015be4 100644
--- a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/library/fastr/TestJavaInterop.java
+++ b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/library/fastr/TestJavaInterop.java
@@ -1105,6 +1105,19 @@ public class TestJavaInterop extends TestBase {
         assertEvalFastR(CREATE_TEST_ARRAYS + " ifelse(ta$stringList, 1, 2)", "c(NA, NA, NA)");
     }
 
+    @Test
+    public void testArraysWithNullConversion() throws IllegalArgumentException {
+        assertEvalFastR(CREATE_TEST_ARRAYS + "as.vector(ta$booleanObjectArrayWithNull)", "list(T, NULL, T)");
+        assertEvalFastR(CREATE_TEST_ARRAYS + "as.vector(ta$byteObjectArrayWithNull)", "list(1, NULL, 3)");
+        assertEvalFastR(CREATE_TEST_ARRAYS + "as.vector(ta$charObjectArrayWithNull)", "list('a', NULL, 'c')");
+        assertEvalFastR(CREATE_TEST_ARRAYS + "as.vector(ta$doubleObjectArrayWithNull)", "list(1.1, NULL, 1.3)");
+        assertEvalFastR(CREATE_TEST_ARRAYS + "as.vector(ta$floatObjectArrayWithNull)", "list(1.1, NULL, 1.3)");
+        assertEvalFastR(CREATE_TEST_ARRAYS + "as.vector(ta$integerObjectArrayWithNull)", "list(1L, NULL, 3L)");
+        assertEvalFastR(CREATE_TEST_ARRAYS + "as.vector(ta$longObjectArrayWithNull)", "list(1, NULL, 3)");
+        assertEvalFastR(CREATE_TEST_ARRAYS + "as.vector(ta$shortObjectArrayWithNull)", "list(1L, NULL, 3L)");
+        assertEvalFastR(CREATE_TEST_ARRAYS + "as.vector(ta$stringArrayWithNull)", "list('a', NULL, 'c')");
+    }
+
     @Test
     public void testForeignVectorArithmeticOp() throws NoSuchFieldException,
                     IllegalAccessException {
@@ -2216,38 +2229,47 @@ public class TestJavaInterop extends TestBase {
         public Boolean[] booleanObjectArray = {true, false, true};
         public Boolean[][] booleanObjectArray2 = {{true, false, true}, {true, false, true}};
         public Boolean[][][] booleanObjectArray3 = {{{true, false, true}, {true, false, true}}, {{true, false, true}, {true, false, true}}};
+        public Boolean[] booleanObjectArrayWithNull = {true, null, true};
 
         public Byte[] byteObjectArray = {1, 2, 3};
         public Byte[][] byteObjectArray2 = {{1, 2, 3}, {1, 2, 3}};
         public Byte[][][] byteObjectArray3 = {{{1, 2, 3}, {1, 2, 3}}, {{1, 2, 3}, {1, 2, 3}}};
+        public Byte[] byteObjectArrayWithNull = {1, null, 3};
 
         public Character[] charObjectArray = {'a', 'b', 'c'};
         public Character[][] charObjectArray2 = {{'a', 'b', 'c'}, {'a', 'b', 'c'}};
         public Character[][][] charObjectArray3 = {{{'a', 'b', 'c'}, {'a', 'b', 'c'}}, {{'a', 'b', 'c'}, {'a', 'b', 'c'}}};
+        public Character[] charObjectArrayWithNull = {'a', null, 'c'};
 
         public Double[] doubleObjectArray = {1.1, 1.2, 1.3};
         public Double[][] doubleObjectArray2 = {{1.1, 1.2, 1.3}, {1.1, 1.2, 1.3}};
         public Double[][][] doubleObjectArray3 = {{{1.1, 1.2, 1.3}, {1.1, 1.2, 1.3}}, {{1.1, 1.2, 1.3}, {1.1, 1.2, 1.3}}};
+        public Double[] doubleObjectArrayWithNull = {1.1, null, 1.3};
 
         public Float[] floatObjectArray = {1.1f, 1.2f, 1.3f};
         public Float[][] floatObjectArray2 = {{1.1f, 1.2f, 1.3f}, {1.1f, 1.2f, 1.3f}};
         public Float[][][] floatObjectArray3 = {{{1.1f, 1.2f, 1.3f}, {1.1f, 1.2f, 1.3f}}, {{1.1f, 1.2f, 1.3f}, {1.1f, 1.2f, 1.3f}}};
+        public Float[] floatObjectArrayWithNull = {1.1f, null, 1.3f};
 
         public Integer[] integerObjectArray = {1, 2, 3};
         public Integer[][] integerObjectArray2 = {{1, 2, 3}, {1, 2, 3}};
         public Integer[][][] integerObjectArray3 = {{{1, 2, 3}, {1, 2, 3}}, {{1, 2, 3}, {1, 2, 3}}};
+        public Integer[] integerObjectArrayWithNull = {1, null, 3};
 
         public Long[] longObjectArray = {1L, 2L, 3L};
         public Long[][] longObjectArray2 = {{1L, 2L, 3L}, {1L, 2L, 3L}};
         public Long[][][] longObjectArray3 = {{{1L, 2L, 3L}, {1L, 2L, 3L}}, {{1L, 2L, 3L}, {1L, 2L, 3L}}};
+        public Long[] longObjectArrayWithNull = {1L, null, 3L};
 
         public Short[] shortObjectArray = {1, 2, 3};
         public Short[][] shortObjectArray2 = {{1, 2, 3}, {1, 2, 3}};
         public Short[][][] shortObjectArray3 = {{{1, 2, 3}, {1, 2, 3}}, {{1, 2, 3}, {1, 2, 3}}};
+        public Short[] shortObjectArrayWithNull = {1, null, 3};
 
         public String[] stringArray = {"a", "b", "c"};
         public String[][] stringArray2 = {{"a", "b", "c"}, {"a", "b", "c"}};
         public String[][][] stringArray3 = {{{"a", "b", "c"}, {"a", "b", "c"}}, {{"a", "b", "c"}, {"a", "b", "c"}}};
+        public String[] stringArrayWithNull = {"a", null, "c"};
 
         public Object[] onlyIntegerObjectArray = {1, 2, 3};
         public Object[] onlyLongObjectArray = {1L, 2L, 3L};